POJ-1300 Door Man 欧拉回路判定
题意:给定一个无向图的关系,判定是否存在一条从M点出发回到0点并且走遍所有边的通路,也即欧拉通路。
解法:该题如果当出发点就为0点话就等效于是否存在欧拉回路了。欧拉通路的判定条件为:
连通的无向图中,度为奇数节点的个数为0个或者是2个。
由于该题限定了起点和端点,因此度为奇数的点只能够由两个,且为M和0。当M==0时,奇数节点个数为0个符合题意,此时将构成一条欧拉回路。
代码如下:
#include <cstdlib> #include <cstring> #include <cstdio> #include <iostream> #include <algorithm> #include <vector> using namespace std; int N, M; int deg[25]; vector<int>v; int main() { char ss[1000]; int length ,cnt, can; while (scanf("%s", ss), ss[0] != 'E') { scanf("%d %d", &M, &N); getchar(); // 读掉末尾的换行 v.clear(); cnt = 0, can = 1; memset(deg, 0, sizeof (deg)); for (int i = 0; i < N; ++i) { gets(ss); int t; char *p = strtok(ss, " "); while (p) { t = atoi(p); ++deg[i], ++deg[t], ++cnt; p = strtok(NULL, " "); } } for (int i = 0; i < N; ++i) { if (deg[i] & 1) { v.push_back(i); } } if (v.size() > 2) { puts("NO"); } else if (v.size() == 2){ if (v[0] == 0 && v[1] == M) { printf("YES %d\n", cnt); } else { puts("NO"); } } else { if (M == 0) { printf("YES %d\n", cnt); } else { puts("NO"); } } scanf("%s", ss); } return 0; }