P5318
大体思路是通过邻接表储存点的关系,并且使用vector,之后便是按题意模拟。
代码3TLE2WA,但根据时间复杂度来算是不会超时的,bfs找不到与我类似的做法
代码:(球球您了,感激不尽
#include<bits/stdc++.h>
using namespace std;
int n,t,m,x,y;
int k[2100000],b[2100000],c[2100000];
vector<int> a[1100000];
int print(){for(int i=1;i<=n;i++)printf("%d ",k[i]);puts("");t=0,memset(b,0,sizeof(b)),memset(k,0,sizeof(k));}
void dfs(int K)
{
if(t==n){print();return;}
for(int i=1;i<=a[K].size();i++)
if(!b[a[K].at(i-1)])k[++t]=a[K].at(i-1),b[a[K].at(i-1)]=1,dfs(a[K].at(i-1));
}
int bfs(int x)
{
int h=0,t=1,cx;
b[x]=1;
k[1]=x;
while(h<t)
{
h++;
for(int i=1;i<=a[k[h]].size();i++)
{
cx=a[k[h]].at(i-1);
if(b[cx])continue;
k[++t]=cx;
b[cx]=1;
}
}
print();
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)scanf("%d%d",&x,&y),a[x].push_back(y);
for(int i=1;i<=n;i++)sort(a[i].begin(),a[i].end());
t=k[1]=1;
dfs(1);
bfs(1);
return 0;
}