题意:给定一个无向图的关系,判定是否存在一条从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; }