zoukankan      html  css  js  c++  java
  • uva 10129

    主要是求能否形成联通的欧拉回路

    并查集+ 欧拉回路判断

    一开始用dfs判断联通,死活A不出来,Wa了好多次………哭……

    并查集一次就AC了

    感觉还是并查集代码好写一点,

    因为dfs还要判断入口在哪里……2333333

    判断欧拉回路:

    1.判断联通(dfs|并查集)

    2.判断欧拉回路的条件(1.要么所有的点出度等于入度,2.要么只能有一个出度比入度大于1(入口),一个入度比出度小于1(出口)其他的点必须出度等于入度)

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #include <cstdlib>
    #include <stack>
    #include <cctype>
    #include <string>
    #include <malloc.h>
    #include <queue>
    #include <map>
    
    using namespace std;
    const int INF = 0xffffff;
    const double Pi = 4 * atan(1);
    const int Maxn = 200 + 10;
    //int dir2[8][2] = {{-1,0},{0,-1},{-1,1},{1,-1},{-1,-1},{1,0},{0,1},{1,1}};
    
    int in[26];
    int out[26];
    int f[26];
    
    int _f(int i){
        if(f[i] == i)
            return i;
        return _f(f[i]);
    }
    
    int main()
    {
    #ifndef ONLINE_JUDGE
        freopen("inpt.txt","r",stdin);
    #endif
        int t;
        cin >> t;
        int n;
        while(t--){
            cin >> n;
            memset(in,0,sizeof(in));
            memset(out,0,sizeof(out));
            for(int i = 0;i < 26;i++)
                f[i] = i;
            while(n--){
                char str[1100];
                cin >> str;
                int len = strlen(str);
                in[ str[0] - 'a' ]++;
                out[ str[len-1] - 'a' ]++;
                int x = _f( str[0] - 'a' );
                int y = _f( str[len-1] - 'a');
                if(x != y)
                    f[x] = y;
            }
            int cnt = 0;
            int start = 0;
            int enn = 0;
            for(int i = 0;i < 26;i++){
                if(in[i] != out[i]){
                    cnt++;
                    if(in[i] - out[i] == 1)
                        start++;
                    else if(out[i] - in[i] == 1)
                        enn++;
                    else
                        cnt = 3;
                    if(cnt > 2)
                        break;
                }
            }
            bool flag = 1;
            if(start == 1 && enn == 1 && cnt == 2){
                flag = 0;
            }
            else if(cnt == 0){
                flag = 0;
            }
            if(!flag){
                for(int i = 0;i < 26;i++){
                    if(in[i] || out[i]){
                        for(int j = 0;j < 26;j++){
                            if( (in[j] || out[j] ) && _f(i) != _f(j)){
                                flag = 1;
                                break;
                            }
                        }
                        break;
                    }
                }
            }
            if(flag)
                cout << "The door cannot be opened." << endl;
            else
                cout << "Ordering is possible." << endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Informatica_(6)性能调优
    Informatica_(5)高级应用
    Informatica_(4)工作流
    Informatica_(3)组件
    Informatica_(2)第一个例子
    Informatica_(1)安装
    Linux_(4)Shell编程(下)
    Linux_(3)Shell编程(上)
    Linux_(2)基本命令(下)
    B
  • 原文地址:https://www.cnblogs.com/hanbinggan/p/4230144.html
Copyright © 2011-2022 走看看