1. 程式人生 > >poj2230(歐拉路)

poj2230(歐拉路)

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; // 鄰接表
int
stack[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(歐拉路)