也不会用容器vector QAQ
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=1e7+5;
int n,m,a,b;
bool visit[maxn];
int head[maxn],Next[maxn];
struct Edge{
int from,to;
}edge[maxn];
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
return x*f;
}
bool cmp(Edge x,Edge y)
{
if(x.from==y.from) return x.to>y.to;
return x.from<y.from;
}
void dfs(int x)
{
printf("%d ",x);
visit[x]=true;
for(int j=head[x];j;j=Next[j])
{
if(!visit[edge[j].to])
dfs(edge[j].to);
}
}
void bfs(int x)
{
queue <int> q;
q.push(x);
visit[x]=1;
while(!q.empty())
{
for(int j=head[x];visit[edge[j].to]!=1;j=Next[j])
{
visit[edge[j].to]=1;
q.push(edge[j].to);
}
printf("%d ",q.front());
q.pop();
}
}
int main()
{
n=read();m=read();
for(int i=1;i<=m;++i)
{
a=read();
edge[i].from=a;
b=read();
edge[i].to=b;
}
sort(edge+1,edge+m+1,cmp);
for(int i=1;i<=m;++i)
{
Next[i]=head[edge[i].from];
head[edge[i].from]=i;
}
for(int i=1;i<=n;++i)
{
visit[0]=1;
if(!visit[i])
{
dfs(i);
}
}
printf("\n");
for(int i=1;i<=n;++i)
{
bfs(i);
}
return 0;
}