水题,不过这里整理一下欧拉路的基本概念和判断方法。
欧拉路:G为连通无向图,经过G每条边一次并且仅有一次的路径成为欧拉路
欧拉回路:欧拉路的起点和终点为同一个点的路
具有欧拉回路的无向图G称为欧拉图
判定:
无向图的判定:顶点的度全为偶数或者有且只有两个为奇数的图有欧拉路。如果顶点全为偶数,则可以以任意点为起点并且最终会回到起点构成欧拉回路。如果顶点有两个点为奇数,则这两个点必定为起点和终点。
有向图的判定:顶点的出度和入度之差全部为0或者只有一个点为1,一个点为-1的图有欧拉路。如果全部为0则可以取任意点为起点并且最终会回到起点构成欧拉回路,否则则差为1的点为起点,-1的为终点。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
#include <sstream>
using namespace std;
typedef long long LL;
const int maxn = 105;
int deg[maxn],n,m;
string buf;
int main() {
//freopen("/tmp/in.txt","r",stdin);
while(cin >> buf) {
int cntodd = 0,cntdoor = 0;
if(buf == "ENDOFINPUT") break;
memset(deg,0,sizeof(deg));
cin >> n >> m;
getline(cin,buf);
for(int i = 0;i < m;i++) {
getline(cin,buf);
int tmp;
stringstream sin(buf);
while(sin >> tmp) {
deg[i]++;
deg[tmp]++;
cntdoor++;
}
}
cin >> buf;
for(int i = 0;i <= m;i++) if(deg[i] & 1) cntodd++;
if(cntodd == 0 && n == 0) cout << "YES " << cntdoor;
else if(cntodd == 2 && n != 0 && deg[0] % 2 && deg[n] % 2)
cout << "YES " << cntdoor;
else cout << "NO";
cout << endl;
}
return 0;
}