您的位置:首页 > 其它

poj 2230 Watchcow 无向欧拉回路求路径

2016-08-06 16:15 381 查看
传送门:poj 2230 Watchcow

题目大意

从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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: