入队6-HDU-1878

萌新寒假第一次比赛——小学生专场
F-欧拉回路
     欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
Input
    测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
    束。
Output
    每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。
Sample Input
    3 3
    1 2
    1 3
    2 3
    3 2
    1 2
    2 3
    0
Sample Output
    1
    0
思路:欧拉回路是典型的运用并查集的题目,欧拉回路首先是连通图,因此若看作
一棵树的话必须是只有一个根节点,每个节点都可通过找上一级的方法找到根节点。
定义pre数组存储每个节点的上一级,初始化是每个节点的上一级为自身,即pre[i]=i,
定义cnt数组存储每个节点的度数,每次输入一条边(假设两个节点为a和b)的时候,
两个节点的度数均加1,并且边可以将两个树连为一棵树,因此如果两个节点的根节点
不相同时,可令一个节点的根节点是另一个节点的根节点的上一级
(可以是pre[find(a)]=find(b)),此时可以将两棵树连为一棵树。其中find函数的
返回值是此节点的根节点。
int find(int x)
{
 while(pre[x]!=x) x= pre[x];
 return x;
}
最后cnt数组和pre数组更新之后,设置flag=1,sum=0(sum是根节点个数)
if(cnt[i]==0||cnt[i]%2!=0) flag=0;//如果某节点度数为0或为奇数 则flag=0
sum的值通过遍历n个节点 出现一次pre[i]=i 则sum++
因此若flag=0或sum!=1则不是欧拉回路 输出0 否则输出1






猜你喜欢

转载自blog.csdn.net/irving0323/article/details/81051887