码迷,mamicode.com
首页 > 其他好文 > 详细

欧拉回路

时间:2018-03-04 21:19:05      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:pos   iostream   std   连通   解题思路   测试用例   节点   有一个   ret   

描述

欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?

输入

测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是节点数N ( 1 < N < 1000 )和边数M;随后的M行对应M条边,每行给出一对正整数,分别是该条边直接连通的两个节点的编号(节点从1到N编号)。当N为0时输入结
束。

输出

每个测试用例的输出占一行,若欧拉回路存在则输出1,否则输出0。

样例输入

3 3
1 2
1 3
2 3
3 2
1 2
2 3
0

样例输出

1
0

解题思路:欧拉回路条件: 所有的边都联通且每个顶点的度数是偶数

#include <iostream>
using namespace std;
int p[1005];
int d[1005];//存储顶点的度数
int find(int x)
{
    if(x!=p[x])
        p[x]=find(p[x]);
    return p[x];
}
int main()
{
    int n,m,i,j,k,flag;
    std::ios::sync_with_stdio(false);
    while(cin>>n&&n){
        cin>>m;
        flag=1;
        for(i=1;i<=n;i++){
            p[i]=i;
            d[i]=0;
        }
        for(i=0;i<m;i++){
            int a,b;
            cin>>a>>b;
            int x=find(a);
            int y=find(b);
            p[x]=y;
            d[a]++;
            d[b]++;
        }
        int cnt=0;   //储存有几块联通的
        for(i=1;i<=n;i++){
            if(p[i]==i)
            cnt++;
        }
        if(cnt!=1)
        flag=0;   //判断是否只有一个联通快
        for(i=1;i<=n;i++){
            if(d[i]%2==1)  //度数为偶数
            flag=0;
        }
        if(flag)
            cout<<"1"<<endl;
        else
            cout<<"0"<<endl;
    }

}

 

欧拉回路

标签:pos   iostream   std   连通   解题思路   测试用例   节点   有一个   ret   

原文地址:https://www.cnblogs.com/ww123/p/8505621.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!