HDU-3018几笔画问题
来源:互联网 发布:娱乐圈爆料知乎天涯 编辑:程序博客网 时间:2024/06/10 23:58
题目大意:问由几条道路组成的图需要几笔画完成;
解题思路:如果图是一条链或欧拉回路只需一笔画,但如果不连通,分为几个小子图,怎么解决??每个子图中的嫉妒点数除以2,然后把所有子图的奇度点数除以2,加起来就是总共需要几笔画;
#include<iostream>#include<cstring>using namespace std;#define MAX 100001int father[MAX],node[MAX],flag[MAX];int n;int find(int t)//并查集{ if(father[t]!=t) father[t]=find(father[t]); return father[t];}void work(){ int x; for(int i=1;i<=n;i++) { x=find(i);//记录父节点,一个父节点大祖先就是一个子图,如果只有一个,即为连通图 if(flag[x]==-1&&node[i])//如果父节点没有调用过并且有入度点,初始化为0 flag[x]=0; if(node[i]%2==1)//记录奇度点数 flag[x]++; }}int main(){ int m,i,sum,a,b; while(cin>>n>>m) { memset(node,0,sizeof(node)); memset(flag,-1,sizeof(flag)); sum=0; for( i=1;i<=n;i++) father[i]=i; while(m--) { cin>>a>>b; node[a]++;node[b]++;//路是双向的 father[find(a)]=find(b); } work(); for(i=1;i<=n;i++) { if(flag[i]!=-1) { if(flag[i]==0)//为0则表示没有奇度点,一笔画就能完成 sum++; else sum+=flag[i]/2;//奇度点除以2即为需要几笔画完成 } } cout<<sum<<endl; } return 0;}