hdu 3018(欧拉回路)

来源:互联网 发布:苏联政治笑话 知乎 编辑:程序博客网 时间:2024/05/20 16:12

点击打开链接


题目说有n个点,m跳路,让你分最少的组,使,每组都走一天欧拉通路。。

通过判断度数是奇偶性来确定是否为欧拉回路;总之笔划数 = 奇度点数/+ 欧拉回路数;


#include"stdio.h"#include"string.h"#define N 100001int a[N*2],b[N*2];struct node{int father;int rank;int degree;int count;}A[N];int find(int x){if(A[x].father==x)return x;A[x].father=find(A[x].father);return A[x].father;}void merge(int a,int b){if(A[a].rank>=A[b].rank){A[b].father=a;if(A[a].rank==A[b].rank)A[a].rank++;A[a].count+=A[b].count;}else{A[a].father=b;A[b].count+=A[a].count;}}int main(){int n,m;int i,j;int x,y;while(scanf("%d%d",&n,&m)!=-1){memset(A,0,sizeof(A));for(i=0;i<=n;i++)A[i].father=i;for(i=0;i<m;i++){scanf("%d%d",&a[i],&b[i]);A[a[i]].degree++;A[b[i]].degree++;}for(i=1;i<=n;i++)if(A[i].degree%2)A[i].count=1;for(i=0;i<m;i++){x=find(a[i]);y=find(b[i]);if(x!=y)merge(x,y);}int ans=0;for(i=1;i<=n;i++){if(A[i].degree&&A[i].father==i){if(A[i].count!=0)ans+=A[i].count/2;else ans++;}}printf("%d\n",ans);}return 0;}


原创粉丝点击