题目大意
从1开始每个节点访问两次,打印任一路径
解题思路
因为要求每个节点访问两次,这也就暗示了每个节点之间连通是双向的。所以建边的时候只要双向建立边就好了,也就是建立无向图。两个点之间也就是两条边,然后再用DFS一直找下去就好了!
AC代码
#include<cstdio>
#include<cstring>
const int MAXN = 50000*4+5;
int path[MAXN],head[MAXN],IN[MAXN];
int start,edgeCnt,k,tot;
bool vis[MAXN];
struct Edge{
int v,nxt,id;
}E[MAXN<<1];
void initEdge()
{
edgeCnt = 0;
k=0;
tot = 0;
memset(IN,0,sizeof IN);
memset(vis,0,sizeof vis);
memset(head,-1,sizeof head);
}
void dfs(int u)
{
for(int i=head[u];~i;i=E[i].nxt)
{
int v = E[i].v;
int id= E[i].id;
if(!vis[id])
{
vis[id] = true;
dfs(v);
path[tot++] = v;
}
}
}
void addEdge(int u,int v)
{
E[edgeCnt].v = v;
E[edgeCnt].id = k++;
E[edgeCnt].nxt = head[u];
head[u] = edgeCnt++;
}
int main()
{
int N,M;
int u,v;
while(~scanf("%d%d",&N,&M))
{
initEdge();
for(int i=0;i<M;i++)
{
scanf("%d%d",&u,&v);
addEdge(u,v);
addEdge(v,u);
IN[u]++;
IN[v]++;
}
//printf("----\n");
dfs(1);
puts("1");
for(int i=tot-1;i>=0;i--)
printf("%d\n",path[i]);
}
return 0;
}