HDU 1878.欧拉回路
Problem Description
欧拉回路是指不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。现给定一个图,问是否存在欧拉回路?
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
欧拉回路是什么鬼 Σ(⊙▽⊙”a
欧拉回路:图G,若存在一条路,经过G中每条边有且仅有一次,称这条路为欧拉路,如果存在一条回路经过G每条边有且仅有一次, 称这条回路为欧拉回路。具有欧拉回路的图成为欧拉图。 判断欧拉路是否存在的方法 有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。 无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。 判断欧拉回路是否存在的方法 有向图:图连通,所有的顶点出度=入度。 无向图:图连通,所有顶点都是偶数度。
用bfs判断是不是连通图,然后再判断各个顶点的度是不是偶数
↓↓↓↓↓代码↓↓↓↓↓
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <string.h>
using namespace std;
typedef long long ll;
const long long M = 1e9+7;
const int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int map[1005][1005], deg[1005], n, m, vis[1005];
bool bfs() //判断图是否连通
{
int i, t;
queue<int> q;
q.push(1);
while(!q.empty())
{
t = q.front();
q.pop();
for (i = 1; i <= n; i++)
{
if (!vis[i] && map[t][i])
{
q.push(i);
vis[i] = 1;
}
}
}
for (i = 1; i <= n; i++)
{
if (!vis[i])
{
return false;
}
}
return true;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("1.txt", "r", stdin);
#endif
int a, b;
int i, j;
bool flag;
while(scanf("%d", &n), n)
{
cin >> m;
flag = true;
memset(deg, 0, sizeof(deg));
memset(vis, 0, sizeof(vis));
memset(map, 0, sizeof(map));
for (i = 0; i < m; i++)
{
scanf("%d%d", &a, &b);
deg[a]++;
deg[b]++;
map[a][b] = map[b][a] = 1;
}
for (i = 1; i <= n; i++) //判断每个顶点的度是不是偶数
{
if (deg[i] & 1)
{
flag = false;
break;
}
}
if (!flag)
{
cout << "0" << endl;
}
else if (bfs())
{
cout << "1\n";
}
else
{
cout << "0\n";
}
}
}