The Necklace UVA - 10054

版权声明:本文为博主原创文章,欢迎转载。 https://blog.csdn.net/Smiler_/article/details/79928609

题意:给你一些珠子,让你串成一个链,其中要求相邻的珠子相邻部分颜色相同。珠子的颜色用数字表示,范围从1到50.

思路:如果能串成一条链,那么说明从任意点出发都可以回到原处,其实就是判断欧拉回路。我们首先判断所有珠子的度数是不是偶数,如果不是偶数肯定不可以,由判断欧拉回路的条件可知,如果所有珠子的度数都是偶数,那么一定存在一条欧拉回路。我们只需要输出欧拉回路即可。

在输出欧拉回路的时候我们用dfs输出,注意是逆序输出,这个地方可能有点抽象,自己出一组数据理解一些,例如(1->2->3->2->1),逆序输出主要是防止回溯的时候出现连不成串的情况出现。

#include <bits/stdc++.h>
#define N 55
#define MAX 1010
int g[N][N],vis[N];
int d[N];
int n;
int cnt;

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\n",v,u);

        }
}
int main()
{
    int t,T;
    int i,j;
    int u,v;

    scanf("%d",&T);
    for(t=1 ; t<=T; t++)
    {
        cnt=0;
        memset(g,0,sizeof(g));
        memset(vis,0,sizeof(vis));
        memset(d,0,sizeof(d));
        scanf("%d",&n);
        for(i=1 ; i<=n; i++)
        {
            scanf("%d%d",&u,&v);
            d[u]++;
            d[v]++;
            g[u][v]++;
            g[v][u]++;
        }
        printf("Case #%d\n",t);

        //图是连通的,要判断所有点的度是否有为偶数

        for(i=1 ; i<=50; i++)
            if( d[i]%2 )
                break;
        if(i<=50)
            printf("some beads may be lost\n");
        else  //图连通而且所有点的度都为偶数,则是一个欧拉回路,输出路径
            for(i=1; i<=50; i++)
                euler(i);

        if(t!=T) printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Smiler_/article/details/79928609