UVA10054-The Necklace

题目大意:给你一些珠子,每个珠子都会有两个数值,珠子与珠子之间能相连当且仅当它们的连接处数值相等,

                  问你能不能由这些珠子组成一条项链,即所有珠子都相连起来(包含头与尾)。


题目分析:这是一道关于欧拉回路的题目,我们可以把珠子与珠子连接处的两个数值抽象成一个点,然后可以试试几个样例发现这是                     一条点与点之间只连一条线且从头到头的路径,是符合欧拉路径的定义的。

                 判断图中是否存在欧拉路径有两个要素:一、路径中所有点的度数都为偶数。二、图为连通。

                这题默认图为连通,那么判定路径中的度数为偶数就可以了。

                最后递归输出路径就可以了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
using namespace  std;
int vis[100][100],deg[100],cnt;
int N,temp;
int record[1050];
void dfs(int x)
{
    for(int i=1;i<=50;i++)
    {
        if(vis[i][x]>0)
        {
            vis[x][i]--;
            vis[i][x]--;
            dfs(i);
            printf("%d %d\n",i,x);
        }
    }
}
int main()
{
    int T,case1=0;
    scanf("%d",&T);
    while(T--)
    {
        cnt=0;

        memset(vis,0,sizeof(vis));
        memset(deg,0,sizeof(deg));
        temp=0;

         scanf("%d",&N);
         int num=0;
        for(int i=0;i<N;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);

            vis[a][b]++;
            vis[b][a]++;
            deg[a]++;
            deg[b]++;
        }
        for(int i=1;i<=50;i++)
        {
            if(deg[i]&1)
                num++;
        }
         printf("Case #%d\n",++case1);
        if(num==0)
            {
                for(int i=1;i<=50;i++)
                    dfs(i);
            }
        else
            printf("some beads may be lost\n");
          if(T!=0)
            printf("\n");
    }
    return 0;
}

               

                 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值