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;}

原创粉丝点击