简单的欧拉回路算法问题

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

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
看到此题目其实最容易想到的就是离散数学上的知识,看某个图是否为欧拉回路只要看他的每个顶点的度是不是都为偶数即可,但是最容易忽略一点,就是要先检查此图是否联通!若不联通一定没有欧拉回路,

用一个二维数组做深度广度遍历?可以但是有点儿复杂还有点儿慢,有一个更好的武器------并查集!

具体文章请见   http://blog.csdn.net/dellaserss/article/details/7724401/






-----------------------------------------------------------------------------------------------------------------------------------

俗话说的好代码是最诚实的小伙伴!  思路:先检查是不是联通 若联通则看是不是有奇数度的点

AC代码:

#include
#include
using namespace std;
int pre[1001];
bool par[1001];
int power[1001];
int find(int x)
{
     while(pre[x] != x)
     x = pre[x];
     return x;
}
void mix(int x,int y)
{
    int fx = find(x);
    int fy = find(y);
    if(fx!=fy)
    pre[fx] = fy;
}
int main()
{
    int n,m,i,j,count,a,b;
    while(scanf("%d%d",&n,&m)&&n)
    {
        memset(power,0,sizeof(power));
        for(i = 1;i<=n;i++)
        pre[i] = i;
        for(i = 0;i         {
            scanf("%d%d",&a,&b);
            mix(a,b);
            power[a]++;
            power[b]++;
        }
        memset(par,0,sizeof(par));
        for(i = 1;i<=n;i++)
        {
            par[find(i)] = 1;
        }
        for(i = 1,count = 0;i<=n;i++)
            if(par[i])
            count++;
            if(count!=1)
            cout<<"0"<             else{
                for(i = 1;i<=n;i++)
                {
                    if(power[i]%2!=0)
                    {
                        cout<<"0"<                         i = -1;
                        break;
                    }
                }
                if(i>n)
                cout<<"1"<             }
    }
    
    
    return 0;
}


你可能感兴趣的:(算法数据结构学习之路)