zoukankan      html  css  js  c++  java
  • UVa 10129 Play On Words【欧拉道路 并查集 】

    题意:给出n个单词,问这n个单词能否首尾接龙,即能否构成欧拉道路

    按照紫书上的思路:用并查集来做,取每一个单词的第一个字母,和最后一个字母进行并查集的操作

    但这道题目是欧拉道路(下面摘自http://blog.csdn.net/hcbbt/article/details/9316301)

    关于欧拉道路(from Titanium大神):

    判断有向图是否有欧拉路

    1.判断有向图的基图(即有向图转化为无向图)连通性,用简单的DFS即可。如果图都不连通,一定不存在欧拉路

    2.在条件1的基础上   对于欧拉回路,要求苛刻一点,所有点的入度都要等于出度,那么就存在欧拉回路了

      对于欧拉道路,要求松一点,只有一个点,出度比入度大1,这个点一定是起点; 一个点,入度比出度大1,这个点一定是终点.其余点的出度等于入度

     (注意,只能大1,而且这样的点分别只能有1个,而且存在起点就一定要存在终点,存在终点就一定要存在起点)

     1 #include<iostream>  
     2 #include<cstdio>  
     3 #include<cstring> 
     4 #include <cmath> 
     5 #include<stack>
     6 #include<vector>
     7 #include<map>  
     8 #include<algorithm>  
     9 #define mod=1e9+7;
    10 using namespace std;
    11 
    12 typedef long long LL;
    13 int degree[10005],pre[10005],in[10005],out[10005];
    14 char s[10005];
    15 
    16 
    17 int find(int root){ 
    18 return root == pre[root] ? root : pre[root] = find(pre[root]); }
    19 
    20 int main(){
    21     int t,n,i,j,flag,len,root;
    22     cin>>t;
    23     while(t--){
    24         cin>>n;
    25 
    26         for(i=0;i<=30;i++)
    27         pre[i]=i;
    28         memset(in,0,sizeof(in));
    29         memset(out,0,sizeof(out));
    30         
    31         for(i=1;i<=n;i++){
    32         cin>>s;
    33         len=strlen(s);
    34         
    35         int u=s[0]-'a';int v=s[len-1]-'a';
    36         out[u]++;in[v]++;
    37         
    38         pre[find(u)]=find(v);
    39         root=find(v);            
    40       }
    41       
    42       int ans=0,inn=0,outt=0;
    43       for(i=0;i<=30;i++){
    44           if(in[i]||out[i]) {//如果入度或者出度 有一个存在,才继续判断 
    45               if(find(pre[i])!=root)//判断是否属于同一个联通块 
    46           ans++;
    47           if(in[i]-out[i]==1) //如果入度比出度大1的点的个数大于1,则不满足条件 
    48           inn++;
    49           else if(out[i]-in[i]==1)
    50           outt++;
    51           else if(abs(in[i]-out[i])>1)
    52           break;     
    53           }    
    54       }
    55       
    56       if(i<=30||ans>0||inn>1||outt>1) printf("The door cannot be opened.
    ");  //i<=30表明没有正常跳出循环,不构成欧拉道路 
    57       else printf("Ordering is possible.
    ");          
    58     }
    59     return 0;
    60 }
    View Code
  • 相关阅读:
    PHP 使用 GET 传递数组变量
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 数据交换
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 景点游览
    Java实现 蓝桥杯 算法训练 二进制数数
    Java实现 蓝桥杯 算法训练 二进制数数
    Java实现 蓝桥杯 算法训练 二进制数数
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4340857.html
Copyright © 2011-2022 走看看