现在的位置: 首页 > 综合 > 正文

UVa 10054 – The Necklace

2013年07月01日 ⁄ 综合 ⁄ 共 1162字 ⁄ 字号 评论关闭

欧拉回路,先判断其连通性和每个节点的度数的奇偶性(本题中所有节点都应为偶数),如果是欧拉回路则DFS输出结果,注意:每个“珍珠”的两个数字是可以交换的,看第二组样例就会了解 ~

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int p[50+2];
void dfs(int u,int ffio[52][52]) // dfs输出结果
{
    int v;
    for(v = 1; v <= 50 ; v++)
        if(ffio[u][v])
        {
            ffio[u][v]--;
            ffio[v][u]--;
            dfs(v,ffio);
            printf("%d %d\n",v,u);
        }
}
int find(int x) //连通性判断
{
    return p[x] == x ? x : find(p[x]);
}
int main()
{
#ifdef state
    freopen("sample.txt","r",stdin);
#endif
    int num,count,i,cct=1;
    int a[1000+2][3],io[50+2],ffio[50+2][50+2];
    scanf("%d",&count);
    while(count--)
    {
        int flag = 0,min = 100;
        memset(a,0,sizeof(a));
        memset(io,0,sizeof(io));
        memset(ffio,0,sizeof(ffio));
        scanf("%d",&num);
        for(i = 1; i <= 50; i++)
            p[i] = i;
        for(i = 0; i < num ; i++)
        {
            scanf("%d%d",&a[i][0],&a[i][1]);
            int p_in = a[i][0] , p_out = a[i][1];
            if(a[i][0] < min)
                min = a[i][0];
            if(a[i][1] < min)
                min = a[i][1];
            io[p_in]++;
            io[p_out]++;
            ffio[p_in][p_out]++;
            ffio[p_out][p_in]++;
            p_in=find(p_in);
            p_out=find(p_out);
            if(p_in != p_out)
                p[p_in] = p_out;
        }
        int ok = 1;
        int t = find(min);
        for( i++; i <= 50 ; i++ )
            if(io[i] && find(i) != t)
            {
                ok = 0;
                break;
            }
        if(ok)
            for( i = min; i <= 50; i++ )
                if( io[i] % 2 ) //节点度数判断
                {
                    flag = 1;
                    break;
                }
        printf("Case #%d\n",cct++);
        if(flag || !ok)
            printf("some beads may be lost\n");
        else
            dfs(min,ffio);
        if(count)
            puts("");
    }
    return 0;
}

抱歉!评论已关闭.