zoukankan      html  css  js  c++  java
  • HDU1116 Play on Words(有向图欧拉通路)

    我把单词当作点,然后这样其实是不对的,这样就要判定是否是哈密顿通路。。

    这题应该把单词的首尾单词当作点,而单词本身就是边,那样就是判定欧拉通路了。

    有向图包含欧拉通路的充要条件是:首先基图连通,然后是所有点的入度=出度 或者 有且只有一点出度=入度+1(起点)且有且只有一点入度=出度+1(终点)

     1 #include<cstdio>
     2 #include<cstring>
     3 using namespace std;
     4 
     5 int par[26];
     6 int Find(int a){
     7     while(par[a]!=a){
     8         par[a]=par[par[a]];
     9         a=par[a];
    10     }
    11     return a;
    12 }
    13 void Union(int a,int b){
    14     int pa=Find(a),pb=Find(b);
    15     if(pa==pb) return;
    16     par[pa]=pb;
    17 }
    18 
    19 int main(){
    20     int t,n;
    21     char s[1111];
    22     scanf("%d",&t);
    23     while(t--){
    24         int deg[26]={0};
    25         bool vis[26]={0};
    26         for(int i=0; i<26; ++i) par[i]=i;
    27 
    28         scanf("%d",&n);
    29         for(int i=0; i<n; ++i){
    30             scanf("%s",s);
    31             ++deg[s[0]-'a']; --deg[s[strlen(s)-1]-'a'];
    32             vis[s[0]-'a']=vis[s[strlen(s)-1]-'a']=1;
    33             Union(s[0]-'a',s[strlen(s)-1]-'a');
    34         }
    35 
    36         int cnt0=0,cnt1=0,cnt2=0,cnt3=0;
    37         for(int i=0; i<26; ++i){
    38             if(vis[i] && par[i]==i) ++cnt0;
    39             if(deg[i]==-1) ++cnt1;
    40             else if(deg[i]==1) ++cnt2;
    41             else if(deg[i]!=0) ++cnt3; 
    42         }
    43         if(cnt0>1 || cnt3!=0 || !(cnt1==1&&cnt2==1 || cnt1==0&&cnt2==0)) puts("The door cannot be opened.");
    44         else puts("Ordering is possible.");
    45     }
    46     return 0;
    47 } 
  • 相关阅读:
    Vue's Demo
    安装informatic过程中的错误
    linux系统字符集
    netstat
    查看linux系统的信息
    以太坊私有链的搭建
    $0 $1
    WordPaster-Joomla_3.4.7-tinymce 4.1.7示例发布
    Joomla3x-CKEditor4x-WordPaster整合示例
    Firefox 43无法安装xpi的问题
  • 原文地址:https://www.cnblogs.com/WABoss/p/4990573.html
Copyright © 2011-2022 走看看