现在的位置: 首页 > 综合 > 正文

UVA 10596 Morning Walk

2019年04月06日 ⁄ 综合 ⁄ 共 1053字 ⁄ 字号 评论关闭

大意略。

思路:无向图的欧拉回路。

条件:1、连通图  2、所有点的度为偶数。

还有需要注意的地方。

这组测试数据:

3 2

0 1

1 0

我测试了一下,可以输出Possible也可以输出Not Possible都可以过。

如果孤立的点不算一个连通分量的话,那么则输出Possible,如果算的话,则输出Not Possible,两者均可。

我的代码把它们单独看做一个连通分量。

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
using namespace std;

const int maxn = 210;

int n, m;

int degree[maxn];
int p[maxn];

void UFset()
{
	for(int i = 0; i < n; i++) p[i] = i;
}

int find(int x)
{
	return x == p[x]? x : p[x] = find(p[x]);
}

void Union(int a, int b)
{
	int x = find(a), y = find(b);
	if(x == y) return ;
	p[x] = y;
}

void init()
{
	UFset();
	memset(degree, 0, sizeof(degree)); //忘记初始化了 
}

void read_case()
{
	init();
	for(int i = 0; i < m; i++)
	{
		int u, v;
		scanf("%d%d", &u, &v);
		degree[u]++, degree[v]++;
		Union(u, v);
	}
}

int check()
{
	int scnt = 0;
	for(int i = 0; i < n; i++) if(p[i] == i) scnt++;
	for(int i = 0; i < n; i++)
	{
		if(degree[i] & 1) return 0;
	}
	return scnt == 1;
}

void solve()
{
	read_case();
	if(check()) printf("Possible\n");
	else printf("Not Possible\n");
}

int main()
{
	while(~scanf("%d%d", &n, &m))
	{
		solve();
	}
	return 0;
}

/* 测试数据 
3 2
0 1
1 0

2 2
1 0
1 0

4 4
0 1
1 0
2 3
3 2

5 6
0 1
1 0
2 3
2 3
0 2
2 0

4 6
1 2
2 1
2 3
2 3
3 1
1 3

2 0

Not Possible/Possible 
Possible
Possible
Not Possible
Not Possible
Not Possible
*/

抱歉!评论已关闭.