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;
}


原文地址:https://www.cnblogs.com/wiklvrain/p/8179416.html