Uva 10054 欧拉回路 打印路径

看是否有欧拉回路 有的话打印路径

欧拉回路存在的条件:

如果是有向图的话

1.底图必须是连通图

2.最多有两个点的入度不等于出度 且一个点的入度=出度+1 一个点的入度=出度-1

如果是无向图的话

1.如果这个无向图的连通的 当最多只有两个度数为奇数的点 就一定有欧拉回路 

当有两个度数为奇数的点的时候 一个为起点 一个为终点

//============================================================================
// Name        : UVA.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <map>
#include <vector>
using namespace std;
const int MAXN=1010;
int F[60];
int find(int x)
{
    if(F[x]==-1)return x;
    else return F[x]=find(F[x]);
}
void bing(int x,int y)
{
    int t1=find(x);
    int t2=find(y);
    if(t1!=t2)F[t1]=t2;
}
int num[60];
int G[60][60];
void Traverse(int u)
{
    for(int v=1;v<=50;v++)
        if(G[u][v]>0)
        {
            G[u][v]--;
            G[v][u]--;
            Traverse(v);
            printf("%d %d\n",v,u);
        }
}
int main()
{
//    freopen("in.txt","r",stdin);
//    freopen("out.txt","w",stdout);
    int T;
    int n;
    scanf("%d",&T);
    int iCase=0;
    while(T--)
    {
        if(iCase>0)printf("\n");
        iCase++;
        scanf("%d",&n);
        int u,v;
        memset(F,-1,sizeof(F));
        memset(num,0,sizeof(num));
        memset(G,0,sizeof(G));
        for(int i=0;i<n;i++)
        {
            scanf("%d%d",&u,&v);
            num[u]++;
            num[v]++;
            bing(u,v);
            G[u][v]++;
            G[v][u]++;
        }
        bool flag=true;
        int temp=-1;
        for(int i=1;i<=50;i++)
        {
            if(num[i]==0)continue;
            if(num[i]%2)
            {
                flag=false;
                break;
            }
            if(temp==-1)
            {
                temp=find(i);
                continue;
            }
            if(temp!=find(i))
            {
                flag=false;
                break;
            }
        }
        printf("Case #%d\n",iCase);
        if(!flag)
        {
            printf("some beads may be lost\n");
            continue;
        }
        for(int i=1;i<=50;i++)
            if(num[i]!=0)
            {
                u=i;
                break;
            }
        Traverse(u);
    }
    return 0;
}

 

posted @ 2017-09-18 19:14  Aragaki  阅读(302)  评论(0编辑  收藏  举报