欧拉回路
【题目描述】
现给定一个图,询问图中是否存在欧拉回路。
【输入描述】
输入多组数据。
每组数据以以下格式输入:
第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; }