Ant Trip(HDU 3018)

Ant Trip

一笔画问题,无向图欧拉路或者欧拉回路,注意题目说了,如果是孤立点,则不用考虑。对于每个连通块,如果全都是偶数度(欧拉回路),则需要1笔;如果不是,则需要奇数度顶点个数的1/2笔。


代码:

#include<bits/stdc++.h> 
using namespace std;
 
int par[100005]; 
 
struct node 
{ 
    int du;
	int ji; 
}G[100005]; 

int u[2*100005],v[2*100005]; 

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; 
	   G[x].ji+=G[y].ji;
    }
}  

int main()  
{  
    int n,m;     
	 
    while(scanf("%d%d",&n,&m)==2)  
    { 
        int count=0;
	    for(int i=1;i<=n;i++) 
        { 
           G[i].du=0; 
           G[i].ji=0;
        }   
		 
        init(n);  
        
        for(int i=1;i<=m;i++)  
        {  
            scanf("%d%d",&u[i],&v[i]);
			G[u[i]].du++;    
            G[v[i]].du++;  
        } 
		  
        for(int i=1;i<=n;i++)  
            if(G[i].du&1)
                G[i].ji=1;
        
        for(int i=1;i<=m;i++)  
		    union_(u[i],v[i]);
        
        for(int i=1;i<=n;i++)  
		   if(par[i]==i&&G[i].du!=0)
		   {  
               if(G[i].ji==0)//奇数点个数为 0,欧拉回路(一笔画)
			       count++;
			   else
			       count+=G[i].ji/2;
		   }
        printf("%d\n",count);
    }  
    return 0;  
}  


猜你喜欢

转载自blog.csdn.net/m0_37846371/article/details/80321145
ANT