UVA - 10129 Play on Words 【有向欧拉图】

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;

#define Maxn 1010
#define N 26
int G[N + 5][N + 5],v_cnt,vis[N + 5],n,in_dge[N + 5],out_dge[N + 5],point[N + 5];

void check_dfs(int u) {
    vis[u] = 1;
    v_cnt--;
    for(int i = 1; i <= N; ++i) {
        if(!vis[i] && G[u][i])  check_dfs(i);
        if(!v_cnt) break;
    }
}

int main(void)
{
    //freopen("in.txt","r",stdin);
   // freopen("out.txt","w",stdout);
    int num;
    while(cin >> n) {
        while(n--) {
            cin >> num;
            memset(G,0,sizeof(G));
            memset(vis,0,sizeof(vis));
            memset(in_dge,0,sizeof(in_dge));
            memset(out_dge,0,sizeof(out_dge));
            memset(point,0,sizeof(point));
            char s[Maxn]; int u,v,len;
            v_cnt = 0;  // 顶点数
            for(int i = 1; i <= num; ++i) {
                cin >> s;
                len = strlen(s);
                u = s[0] - 'a' + 1; v = s[len - 1] - 'a' + 1;
                if(!G[u][v])  { G[u][v] = 1; G[v][u] = 1; }
                if(!point[u]) { v_cnt++; point[u] = 1; }  //计录一共有多少个不同的顶点
                if(!point[v]) { v_cnt++; point[v] = 1; }
                out_dge[u]++; in_dge[v]++;
            }
            int cnt_1 = 0, cnt_2 = 0,cnt_3 = 0;
            for(int i = 1; i <= N; ++i) {
                if(out_dge[i] != in_dge[i]) {   //欧拉图的定理
                        cnt_3++;
                        if(out_dge[i] - 1 == in_dge[i]) cnt_1 = 1;
                        else if(out_dge[i] == in_dge[i] - 1) cnt_2 = 1;
                }
            }
            int cnt = cnt_1 + cnt_2;
            if((cnt == cnt_3 && cnt_3 == 2 ) || !cnt_3) { // 这里千万不要写成 cnt == cnt_3 == 2 因为比较的意义跟你想的不同
                                                        //  计算机的判断是 cnt == cnt_3 == true == 1 ,然而 1 != 2;
                check_dfs(u); //  判断是否为连接图,遍历每个顶点,判断遍历的顶点数是否等于全部的顶点数v_cnt
                if(!v_cnt) cout << "Ordering is possible." << endl;
                else cout << "The door cannot be opened." << endl;
            }
            else cout << "The door cannot be opened." << endl;
        }
    }
    return 0;
}





猜你喜欢

转载自blog.csdn.net/godleaf/article/details/80963989
今日推荐