DFS收索所有的经过路径。且注意当返回时直接v进入数组即可。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<cmath>
#include<math.h>
#include<ctime>
#include<set>
#include<cstdlib>
#include<map>
#include<algorithm>
#define LL long long
using namespace std ;
bool vis[100000];
bool Map[1000][1000];
int ans,vex[1000000],n,f[10000],cnt;
int bj;
void dfs1(int v)
{
vex[ans++]=v;
vis[v]=true;
for(int i=1; i<=n; i++)
{
if(!vis[i]&&(Map[v][i]) )
{
dfs1(i);
//vis[i]=false;
vex[ans++]=v;
}
}
}
int fi(int r)
{
return r==f[r]?r:f[r]=fi(f[r]);
}
void mer(int a,int b)
{
int x=fi(a);
int y=fi(b);
if(x>y)
f[x]=y;
else
f[y]=x;
}
int main()
{
int m,i,j,k;
int cla,a,b,s;
scanf("%d",&cla);
while(cla--)
{
scanf("%d%d%d",&n,&m,&s);
for(i=1; i<=n; i++)
f[i]=i;
// memset(head,-1,sizeof(head));
memset(vis,false,sizeof(vis));
cnt=ans=0;
memset(Map,false,sizeof(Map));
for(i=0; i<m; i++)
{
scanf("%d%d",&a,&b);
Map[a][b]=Map[b][a]=true;
mer(a,b);
}
int tmp=0;
for(i=1; i<=n; i++)
if(f[i]==i)
tmp++;
dfs1(s);
if(tmp==1)
{
for(i=0; i<ans; i++)
i==ans-1?printf("%d\n",vex[i]):printf("%d ",vex[i]);
}
else
{
for(i=0; i<ans; i++)
printf("%d ",vex[i]);
printf("0\n");
}
}
return 0;
}