欧拉回路

【题目描述】

现给定一个图,询问图中是否存在欧拉回路。

【输入描述】

输入多组数据。

每组数据以以下格式输入:

第1行给出两个正整数,分别表示节点数N(1 < N < 1000)和边数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<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,m,i[1000];
bool Vis[1000],f[1000][1000];
bool Check() //欧拉回路中,无向图的每个节点的出度应为偶数。
{
    for (int a=1;a<=n;a++)
      if (i[a]&1)
        return false;
    return true;
}
bool BFS(int T) //宽搜,避免同时存在两个图的情况。
{
    queue <int> Q;
    memset(Vis,0,sizeof(Vis));
    Q.push(T);
    Vis[T]=true;
    while (!Q.empty())
    {
        int t=Q.front();
        Q.pop();
        for (int a=1;a<=n;a++)
          if (f[t][a]&&!Vis[a])
          {
            Vis[a]=true;
            Q.push(a);
          }
    }
    for (int a=1;a<=n;a++)
      if (!Vis[a])
        return false;
    return true;
}
int main() //裸判断是否为欧拉回路图。
{
    while (scanf("%d",&n)!=EOF)
    {
        if (!n)
          break;
        memset(f,0,sizeof(f)); //初始化。
        memset(i,0,sizeof(i));
        scanf("%d",&m);
        for (int a=0;a<m;a++)
        {
            int t1,t2;
            scanf("%d%d",&t1,&t2);
            i[t1]++; //统计无向图节点的出度。
            i[t2]++;
            f[t1][t2]=f[t2][t1]=true;
        }
        if (!Check())
          puts("0");
        else
          if (BFS(1))
            puts("1");
          else
            puts("0");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Ackermann/p/5930044.html