hiho 50 Fleury算法求欧拉路径

来源:互联网 发布:美国大律师 知乎 编辑:程序博客网 时间:2024/04/30 06:42

问题

http://hihocoder.com/problemset/problem/1181?sid=784004

解法

伪代码

DFS(u):    While (u存在未被删除的边e(u,v))        删除边e(u,v)        DFS(v)    End    PathSize ← PathSize + 1    Path[ PathSize ] ← u
#include <bits/stdc++.h>using namespace std;enum{maxn = 1000+4, maxm = 5005};vector<int> G[maxn];int degree[maxn];class E{ public:    E(int _a, int _b)    {        a = min(_a, _b);        b = max(_a, _b);    };    int a, b;    bool operator<(const E& e)const    {        return a==e.a? (b<e.b) : (a<e.a);    }};map<E, int> edgeCnt;void dfs(int u){    for (int i=0; i< G[u].size(); ++i)    {        int v= G[u][i];        E e(u, v);        if (edgeCnt[e])        {            --edgeCnt[e];            dfs(v);        }    }    printf("%d ", u);}int main(){    //freopen("in.txt", "r", stdin);    int n, m;    scanf("%d %d", &n, &m);    memset(degree, 0, sizeof(degree));    edgeCnt.clear();    for (int i=0; i< m; ++i)    {        int a, b;        scanf("%d %d", &a, &b);        G[a].push_back(b);        G[b].push_back(a);        ++degree[a];        ++degree[b];        ++edgeCnt[E(a, b)];    }    int start = 1;    for (int i=2; i<=n; ++i)    {        if (degree[start]==0 || (degree[start]%2 ==0 && degree[i]%2))            start = i;        if (degree[start]%2)            break;    }    dfs(start);    putchar('\n');    return 0;}
0 0
原创粉丝点击