UVA10054-The Necklace

来源:互联网 发布:cmge中手游 知乎 编辑:程序博客网 时间:2024/06/04 19:16

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

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


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

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

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

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

#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;}

               

                 

原创粉丝点击