HDU-1878-欧拉回路
这道题是无向图的欧拉回路,判断是否有欧拉回路。
我又来写欧拉路的题了~
中文题目就不解释啦~
这里用到的是判断欧拉回路的结论:
无向图中,如果一个结点的度数是奇数,那么称这个点是奇点,否则称这个点是偶点。
无向图判断连通的条件:如果图中的点全都是偶点,则存在欧拉回路,任意一个点都可以作为起点和终点。
这道题就是我们把每个结点的度数解决以下,然后判断判断一下从一个点出发是否可以遍历所有点。dfs跑一遍就可以啦~
代码部分:
#include <bits/stdc++.h>
#define mst(a, n) memset(a, n, sizeof(a))
using namespace std;
const int N = 1e3 + 10;
int a[N][N];
int degr[N];
int vis[N];
int n, m;
void dfs(int now)
{
for (int i = 1; i <= n; i++)
{
if (a[now][i] && !vis[i])
{
vis[i] = 1;
dfs(i);
}
}
}
int main()
{
while (~scanf ("%d", &n) && n)
{
mst(a, 0);
mst(degr, 0);
mst(vis, 0);
scanf ("%d", &m);
for (int i = 1; i <= m; i++)
{
int x, y;
scanf ("%d%d", &x, &y);
a[x][y] = a[y][x] = 1;
degr[x]++;
degr[y]++;
}
vis[1] = 1;
dfs(1);
int flag = 1;
for (int i = 1; i <= n; i++)
{
if (!vis[i] || degr[i] & 1)
{
flag = 0;
}
}
cout << flag << endl;
}
return 0;
}