POJ-1300 Door Man
题目大意:
你是一座大庄园的管家,庄园有很多房间,编号从0-n。你需要从m个房间走回到0号房间,并且通过一些房间,在通过这些房间的时候立即把们关上,关上了的门也不能再打开,并且在你回到0号房间的时候,所有的门已经关闭了。问你是否存在这样的路;
解题思路:
这题是道很简单的欧拉通路/欧拉回路判断
我们知道一个定理:无向图G存在欧拉通路的充要条件是:G为联通图,并且G仅有两个奇度数节点或者无奇度数节点。
根据这个就可以看轻松的推断出这个路径是否存在了。
代码:
#include <queue> #include <string> #include <vector> #include <iostream> using namespace std; const int maxn = 25; int deg[maxn]; vector<int> vec[maxn]; int main(){ ios::sync_with_stdio(false); int n, m, a, len, tot; string op, str; op.clear(); str.clear(); while(cin >> op && op != "ENDOFINPUT"){ cin >> m >> n; cin.ignore(1); for(int i = 0; i < maxn; ++i){ vec[i].clear(); deg[i] = 0; } tot = 0; for(int i = 0; i < n; ++i){ str.clear(); getline(cin, str); len = str.length(); a = 0; if(len == 0) continue; for(int j = 0; j <= len; ++j){ if(j == len || str[j] == ' '){ ++deg[a]; ++deg[i]; ++tot; a = 0; vec[i].push_back(a); vec[a].push_back(i); continue; } a *= 10; a += str[j] - '0'; } } cin >> str; int cnt = 0, flag; for(int i = 0; i < n; ++i){ cnt += (deg[i] & 1); } if((cnt == 0 && m == 0) || (cnt == 2 && (deg[0] & 1) && m != 0)) flag = 1; else flag = 0; if(flag) cout << "YES " << tot << endl; else cout << "NO" << endl; } return 0; }