一笔画问题(nyoj 42)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37846371/article/details/80319438

一笔画问题

对于无向图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;  
}  

阅读更多

没有更多推荐了,返回首页