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; }
相关文章推荐
- Poj 2230 Watchcow (欧拉回路)打印欧拉回路路径
- POJ 2230 Watchcow 有向图两次欧拉回路记录路径
- POJ 2230 Watchcow (欧拉回路)
- POJ2230 Watchcow(欧拉回路)
- POJ 2230 Watchcow (欧拉回路模板)
- poj 2230 Watchcow (欧拉回路的应用)
- poj 2230 Watchcow(有向图的欧拉回路)
- POJ - 2230 Watchcow(欧拉回路+dfs输出路径)
- POJ 2230 Watchcow( 欧拉回路 )
- POJ 2230 Watchcow (欧拉回路)
- POJ2230 Watchcow(欧拉回路 + dfs)
- poj 2230 Watchcow(欧拉回路)
- 【POJ - 2230 Watchcow】 欧拉回路
- poj 2230 Watchcow 欧拉回路
- POJ2230 Watchcow【欧拉回路】
- hdu 2230 watchcow 【图论-欧拉回路-遍历-输出路径】
- POJ 2230 Watchcow 欧拉路径 DFS
- poj 2230 Watchcow(欧拉回路)
- (POj 2230)Watchcow [有向欧拉图] 输出欧拉回路
- POJ2230 Watchcow——欧拉回路