• UVA 10129 Play on Words 解题报告


    题意:给定你n个单词,所有单词能否首尾相连

    解题报告:其实这是一个判定有向图的欧拉通路的存在问题,存在的条件是所有的节点入度和出度都相等,或者只存在两个节点,一个 入度减出度等于1  一个出度减入度等于 1  同时还要判断它的联通性

    解题代码:

    // File Name: uva10129.c
    // Author: darkdream
    // Created Time: 2013年06月16日 星期日 22时42分07秒
    
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<time.h>
    #include<math.h>
    #include<ctype.h>
    int map[100][100];
    int in[100];
    int out[100];
    int visit[100];
    void dfs(int k )
    {
       for(int i = 1; i <= 30 ;i ++)
       {
         if(map[k][i] != 0 && visit[i] == 0)
         {
           visit[i] =1;
           dfs(i);
         }
       }
    }
    int main(){
    
       //freopen("/home/plac/problem/input.txt","r",stdin);
       //freopen("/home/plac/problem/output.txt","w",stdout);
       int t;
       scanf("%d",&t);
       while(t--)
       { 
           memset(map,0,sizeof(map));
           memset(in,0,sizeof(in));
           memset(out,0,sizeof(out));
           memset(visit,0,sizeof(visit));
           int n ,a, b;
           char str[1005];
           scanf("%d",&n);
           while(n--)
           {
             scanf("%s",str);
             a = str[0] - 'a' + 1;
             b = str[strlen(str)-1] - 'a' + 1;
             map[a][b] ++;
             in[b] ++;
             out[a] ++;
           }
    
           int sumin =0;
           int sumout = 0;
           int begin = a, ok = 1;
           for(int i =1;i <= 30; i ++)
            {
              if( in[i] - out[i] == 1)
                  sumin++;
              else  if(out[i] - in[i] == 1)
              { 
                  sumout++;
                  begin = i ;
              }
              else if(in[i] != out[i]){ok = 0 ;
                //printf("****
    ");
              }
            }
            visit[begin] = 1;
            dfs(begin);
           for(int i = 1; i <= 30 ;i ++)
           {
               if(in[i] || out[i])
                   if(visit[i] == 0)
                   {   ok = 0;
                  //    printf("****
    ");
                   }
           }
           if(((sumin == 0 && sumout == 0) || (sumin == 1 && sumout == 1) ) && ok)
               printf("Ordering is possible.
    ");
           else
               printf("The door cannot be opened.
    ");
           
       
       }
    return 0 ;
    }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    rpc
    route
    ROLLBACK
    rmdir -删除空目录
    rm
    rlogin
    REVOKE
    resolver
    RESET
    repquota
  • 原文地址:https://www.cnblogs.com/zyue/p/3139536.html
Copyright © 2020-2023  润新知