poj2230(歐拉路)
阿新 • • 發佈:2018-07-26
stream ans col true poj \n 回路 urn main
歐拉路:
經過且不重復經過無向連通圖的每一條邊的路徑
判斷方法:有兩個點的度為奇數其余點度數為偶數的無向連通圖
歐拉回路;
經過且不重復經過無向連通圖的每一條邊的路徑,並且能回到原點
判斷方法:全部點度數為偶數的無向連通圖
歐拉圖
歐拉回路構成的圖
輸出路徑方法
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int head[10010], ver[100010], Next[100010], tot; // 鄰接表 intstack[100010], ans[100010]; // 模擬系統棧,答案棧 bool vis[100010]; int n, m, top, t; void add(int x, int y) { ver[++tot] = y, Next[tot] = head[x], head[x] = tot; } void euler() { stack[++top] = 1; while (top > 0) { int x = stack[top], i = head[x]; // 找到一條尚未訪問的邊 while (i && vis[i]) i = Next[i];// 沿著這條邊模擬遞歸過程,標記該邊,並更新表頭 if (i) { stack[++top] = ver[i]; head[x] = Next[i]; // vis[i] = vis[i ^ 1] = true; } // 與x相連的所有邊均已訪問,模擬回溯過程,並記錄 else { top--; ans[++t] = x; } } } int main() { cin >> n >> m; tot= 1; for (int i = 1; i <= m; i++) { int x, y; scanf("%d%d", &x, &y); add(x, y), add(y, x); } euler(); for (int i = t; i; i--) printf("%d\n", ans[i]); }
#include<cstdio> #include<algorithm> using namespace std; struct my{ int v,next; }; const int maxn=10000+10; const int maxm=100000+10; int adj[maxn],fa,n,m,Stack[maxm],ans[maxm]; my bian[maxm]; bool vis[maxm]; void myinsert(int u,int v){ bian[++fa].v=v; bian[fa].next=adj[u]; adj[u]=fa; } int main(){ int u,v; fa=1; scanf("%d%d",&n,&m); for (int i=1;i<=m;i++){ scanf("%d%d",&u,&v); myinsert(u,v); myinsert(v,u); } int top=0; int x,i; Stack[++top]=1; int t=0; while(top>0){ x=Stack[top]; i=adj[x]; //while(i&&vis[i]) i=bian[i].next; v=bian[i].v; if(i){ Stack[++top]=v; adj[x]=bian[i].next; } else { ans[++t]=x; top--; } } for (int j=t;j>=1;j--) printf("%d\n",ans[j]); return 0; }
poj2230(歐拉路)