UVa 10596 - Morning Walk

纯欧拉回路的题,连通性以及度数,注意 r==0 时特殊情况的处理(此时应该是Not Possible的) ~

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int p[200+5];
int find(int x)
{
    return p[x] == x ? x : find(p[x]);
}
int main()
{
#ifdef state
    freopen("sample.txt","r",stdin);
#endif
    int n,r,i;
    int a[10000+5][3],io[200+5];  
    while(scanf("%d%d",&n,&r)!=EOF)
    {
        if(r == 0)
        {
            printf("Not Possible\n");
            continue;
        }
        int flag = 0;
        memset(a,0,sizeof(a));
        memset(io,0,sizeof(io));
        for(i = 0; i < n; i++)
            p[i] = i;
        for(i = 0; i < r ; i++)
        {
            scanf("%d%d",&a[i][0],&a[i][1]);
            int p_in = a[i][0] , p_out = a[i][1];
            io[p_in]++;
            io[p_out]++;
            p_in=find(p_in);
            p_out=find(p_out);
            if(p_in != p_out)
                p[p_in] = p_out;
        }
        int ok = 1;
        for(i = 0 ; !io[i] ; i++);
        int t = find(i);
        for( i++; i <= n ; i++ )
            if(io[i] && find(i) != t)
            {
                ok = 0;
                break;
            }
        if(ok)
            for( i = 0; i <= n; i++ )
                if( io[i] % 2 )
                {
                    flag = 1;
                    break;
                }
        if(flag || !ok)
            printf("Not Possible\n");
        else
            printf("Possible\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值