zoukankan      html  css  js  c++  java
  • UVa 10054,欧拉回路

    题目链接:https://uva.onlinejudge.org/external/100/10054.pdf

    题目链接:http://vjudge.net/contest/132239#problem/C

    欧拉回路公式:

    1、图是连通的。

    2、所有点的度都是偶数。

    tip: 网上有很多解法,几乎都是一样,由于UVa的数据都是连通的,几乎都没有判连通。

    #include <stdio.h>
    #include <string.h>
    #include <bits/stdc++.h>
    
    using namespace std;
    
    #define N 55
    #define MAX 1010
    int g[N][N],vis[N];
    int d[N];
    int n;
    
    void euler(int u)
    {
        int v;
        for(v=1; v<=50; v++)
            if(g[u][v])
            {
                g[u][v]--;
                g[v][u]--;
                euler(v);
                printf("%d %d
    ",v,u);
            }
    }
    
    void dfs(int k)
    {
        vis[k] = true;
        for(int i=1; i<=50; i++)
        {
            if(g[k][i])
            {
                if(!vis[i])
                    dfs(i);
            }
        }
    }
    
    int main()
    {
        //freopen("input.txt","r",stdin);
        int t,T;
        int i;
        int u,v;
        scanf("%d",&T);
        vector<int> Q;
        for(t=1 ; t<=T; t++)
        {
            memset(g,0,sizeof(g));
            memset(vis,0,sizeof(vis));
            memset(d,0,sizeof(d));
            Q.clear();
            scanf("%d",&n);
            for(i=1 ; i<=n; i++)
            {
                scanf("%d%d",&u,&v);
                d[u]++;
                d[v]++;
                g[u][v]++;
                g[v][u]++;
                Q.push_back(u);
                Q.push_back(v);
            }
            printf("Case #%d
    ",t);
    
            dfs(Q[0]);
            bool flag = true;
            for(i=0; i<Q.size(); i++)
            {
                if(!vis[Q[i]])
                {
                    flag = false;
                    break;
                }
            }
    
            if(!flag)
            {
                printf("some beads may be lost
    ");
                if(t!=T) printf("
    ");
            }
            //图是连通的,要判断所有点的度是否有为偶数
            else
            {
                for(i=1 ; i<=50; i++)
                    if(d[i]%2)
                        break;
                if(i<=50)
                    printf("some beads may be lost
    ");
                else  //图连通而且所有点的度都为偶数,则是一个欧拉回路,输出路径
                    for(i=1; i<=50; i++)
                        euler(i);
                if(t!=T) printf("
    ");
            }
        }
        return 0;
    }
  • 相关阅读:
    Codeforces 492E Vanya and Field
    Codeforces 492D Vanya and Computer Game
    HDU 5125 magic balls(线段树+DP)
    HDU 5124 lines
    Codeforces 488D Strip (set+DP)
    FZU 2079 最大获利(线段树+DP)
    Codeforces 490D Chocolate
    Codeforces 490C Hacking Cypher
    HDU
    HDU
  • 原文地址:https://www.cnblogs.com/TreeDream/p/5874844.html
Copyright © 2011-2022 走看看