zoukankan      html  css  js  c++  java
  • 求出欧拉回路,欧拉路径


    注意, qsz 应该是从2开始的 因为用到了^1
    无向图
    #include <cstdio>
    #include <cstring>
    using namespace std;
    
    const int maxn = 1e3+50;
    struct Edge{
        int st;
        int lst;
        int to;
    }edge[maxn*5];
    int head[maxn];
    int qsz;
    
    inline void add(int u, int v) {
        edge[qsz].st = u;
        edge[qsz].lst = head[u];
        edge[qsz].to  = v;
        head[u] = qsz++;
    }
    
    int in[maxn];
    int ans[5*maxn];
    bool vis[5*maxn*2];
    int qcnt;
    
    void dfs(int u) {
        int i;
        for (i=head[u]; i; i=edge[i].lst) {
            if (!vis[i]) {
                vis[i] = true;
                vis[i^1] = true;
                dfs(edge[i].to);
                // ans[q++] = i; //记录回路的边.
            }
        }
        ans[qcnt++] = u; // 记录回路的点
        // 答案是与起点颠倒的. 
    }
    
    int main()
    {
        int t, n, m, i, j, u, v;
        // init;
        qsz = 2;
        memset(head, 0, sizeof(head));
        qcnt = 0;
        
        scanf("%d%d", &n, &m);
        for (i=1; i<=m; ++i) {
            scanf("%d%d", &u, &v);
            add(u, v);
            add(v, u);
            in[v]++; in[u]++;
        }
        bool flag = true;
        for (i=1; i<=n; ++i) 
            if (in[i] & 1) {
                dfs(i);
                flag = false;
                break;
            }
        if (flag) dfs(1); // 例如两个骨牌是 (1, 2) (1, 2) 这样的情况,两个端点就不是奇数次出现. 这个时候随便选一个作为起点就OK. 
        for (i=0; i<qcnt; ++i) 
            printf("%d ", ans[i]);
        return 0;
    }
    
    
    
     
  • 相关阅读:
    数据库客户端们
    tcl调用tuxedo的一个demo
    tcl实现http请求
    CHAP算法C++实现
    归一化数值
    PPPoE名词解释
    Prism MEF example
    为什么我们要开源
    WPF Issues
    WPF & EF & Prism useful links
  • 原文地址:https://www.cnblogs.com/cgjh/p/9754084.html
Copyright © 2011-2022 走看看