• sgu 101 无向图有双重边的欧拉路径


    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #include <cmath>
    #include <queue>
    #include <stack>
    #include <algorithm>
    using namespace std;
    const int MAXN = 400 + 10;
    struct Edge
    {
        int to, next;
    }edge[MAXN];
    int tot, head[MAXN];
    int vis[MAXN], degree[MAXN];
    int N;
    void addedge(int u, int v)
    {
        edge[tot].to = v;
        edge[tot].next = head[u];
        head[u] = tot++;
    }
    void init()
    {
        tot = 0;
        memset(head, -1, sizeof(head));
        memset(degree, 0, sizeof(degree));
        memset(vis, 0, sizeof(vis));
    }
    void dfs1(int u)
    {
        vis[u] = 1;
        for(int i=head[u];i!=-1;i=edge[i].next)
        {
            int v = edge[i].to;
            if(!vis[v]) dfs1(v);
        }
    }
    int cc;
    int ans[MAXN][2];
    void dfs2(int u)
    {
        for(int i=head[u];i!=-1;i=edge[i].next)
        {
            if(!vis[i])
            {
                vis[i] = 1;
                vis[i^1] = 1;
                int v = edge[i].to;
                dfs2(v);
                if(i %2 == 0) ans[cc++][0] = i / 2 + 1;
                else ans[cc++][1] = i / 2 + 1;
            }
        }
    }
    int main()
    {
        while(scanf("%d", &N)!=EOF)
        {
            int u, v;
            init();
            int root;
            for(int i=1;i<=N;i++)
            {
                scanf("%d%d", &u, &v);
                root = u;
                addedge(u, v); addedge(v, u);
                degree[u]++; degree[v]++;
            }
            int count = 0; int flag = 1;
            int st;
            for(int i=0;i<=6;i++) if(degree[i] & 1)
            {
                count++;
                st = i;
            }
            if(!(count == 0 || count == 2)) flag = 0;
            else
            {
                dfs1(root);
                for(int i=0;i<=6;i++) if(degree[i] > 0 && !vis[i])
                {
                    flag = 0;
                    break;
                }
            }
            if(!flag)
            {
                printf("No solution
    ");
                continue;
            }
            memset(vis, 0, sizeof(vis));
            if(count == 0)
            {
                dfs2(root);
            }
            else dfs2(st);
            for(int i=cc-1;i>=0;i--)
            {
                if(ans[i][0])
                {
                    printf("%d +
    ", ans[i][0]);
                }
                else printf("%d -
    ", ans[i][1]);
            }
        }
        return 0;
    }

  • 相关阅读:
    TF400916错误修复办法
    架构优化
    .net 动态代理的泛型方法支持问题
    解决Kafka-1194问题
    SOA服务总线设计
    SOA初探
    重构心法——提高代码复用率
    重构心法——拆分大对象
    重构心法——你应该这样写方法
    反爬虫那些事儿
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5324938.html
Copyright © 2020-2023  润新知