一笔画问题(nyoj 42)

一笔画问题

对于无向图G,具有一条欧拉路(一笔画),当且仅当G是连通的,且有零个或两个奇数度结点。

代码:

#include<bits/stdc++.h>  
using namespace std;
 
int par[1001];  
int G[1001];  

void init(int n)  
{   
    for(int i=1;i<=n;i++)  
        par[i]=i;  
}  

int find(int x)  
{  
    if(x!=par[x])  
       par[x]=find(par[x]);  
    return par[x];  
}  

void union_(int x,int y)  
{  
    x=find(x);  
    y=find(y);  
    if(x!=y)  
       par[y]=x;  
}  
int main()  
{  
    int N,n,m;     
      
    scanf("%d",&N); 
	 
    while(N--)  
    { 
	    memset(G,0,sizeof(G));  
        scanf("%d%d",&n,&m); 
		 
        init(n);  
        
        int a,b;
        
        for(int i=1;i<=m;i++)  
        {  
            scanf("%d%d",&a,&b);  
            union_(a,b);  
            G[a]++;    
            G[b]++;  
        } 
		 
        int sum_root=0,sum_ji=0;//根结点的个数,记录奇度顶点个数  
        for(int i=1;i<=n;i++)  
        {   if(par[i]==i) sum_root++;  
            if(G[i]&1) sum_ji++;  
        }  
        
        if(sum_root>1)  
        {   
		    printf("No\n"); 
			continue;
		}
		  
        if(sum_ji==0||sum_ji==2)  
            printf("Yes\n");  
        else  
            printf("No\n");  
    }  
    return 0;  
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值