• 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 } 
  • 相关阅读:
    企业付款到零钱,现金红包
    Ubuntu 添加,删除ppa
    Ubuntu16.04下的主题美化
    Mysql 统计查询
    crontab修改默认编辑器
    highcharts PHP中使用
    解决ubuntu开机进入grub界面的问题
    商城功能,助力商家
    PHP获取固定概率
    PHP概率,抽奖
  • 原文地址:https://www.cnblogs.com/WABoss/p/4990573.html
Copyright © 2020-2023  润新知