uva10596 Morning Walk (无向图,欧拉回路,存在性判断)

题意: 一个老头每天早上散步, 他想知道能不能走过所有的路, 回到出发点, 但不走重复的路。

思路:欧拉回路存在性判断。 连通、 度数都为偶数。度数判断就不说了。 说下连通性的判断吧。

1.并查集

2.DFS, 二维数组G表示u-v路的存在性。走过的点做标记, 没走过一个点vertexCount++; 最后如果vertexCount == vertex则连通。

3.DFS,, 二维数组G表示u-v路的数目。 每走过一次,路的数目–, 走过的路数edgeCount++; 最后如果edgeCount == edge则连通。

题目陷阱: R记edge < 2的时候肯定是不能实现的, 要直接输出。

算法复杂度: 缺省

问题: 我用方法1 AC了, 用2 3就一直WA。 目前还在WA。 现在有点恶心了。 mark下, 下次再来切了。

代码: 并查集

/*并查集判断欧拉回路*/#include <cstdio>#include <cstring>using namespace std;#define MAX_V 210int deg[MAX_V];int father[MAX_V];int vertex;int edge;bool okDeg();int findFathers(int);void unite(int, int);int main(){while (scanf("%d%d", &vertex, &edge) == 2 && (vertex + edge)) {//initmemset(deg, 0, sizeof(deg));for (int i = 0; i < vertex; i++) {father[i] = i;}//enterfor (int i = 0; i < edge; i++) {int u, v;scanf("%d%d", &u, &v);deg[u]++;deg[v]++;unite(u, v);}//mark connectedint set = 0;for (int i = 0; i < vertex; i++) {if (father[i] == i) {set++;}}if (!okDeg() || vertex < 2 || set > 1) {printf("Not Possible\n");}else {printf("Possible\n");}}return 0;}bool okDeg(){for (int i = 0; i < vertex; i++) {if (deg[i] % 2 != 0) {return false;}}return true;}int findFathers(int x){while (x != father[x]) {x = father[x];}return x;}void unite(int x, int y){int pX = findFathers(x);int pY = findFathers(y);if (pX != pY) {father[x] = y;}}

你曾经说,最大的愿望,

uva10596 Morning Walk (无向图,欧拉回路,存在性判断)

相关文章:

你感兴趣的文章:

标签云: