poj 1386 Play on Words

来源:互联网 发布:加工中心编程简单实例 编辑:程序博客网 时间:2024/06/05 02:59
题意:如果一个单词的最后一个字母和另一个单词的首字母相同,则它们可以连起来,判断所给的单词能否连成一线。判断图的连通性,可以用dfs或并查集,主要考察欧拉回路的应用。#include<iostream>#include<string.h>#include<stdio.h>const int N=26;using namespace std;struct Node{int in;int out;}degree[N];int vis[N];int g[N][N];char str[1010];int n,t,p1,p2,node;void dfs(int v){     vis[v]=1;     for(int i=0;i<N;i++)     {        if(g[v][i]&&!vis[i])        {           dfs(i);        }     }     node++;}int main(){    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        memset(g,0,sizeof(g));        memset(degree,0,sizeof(degree));        for(int i=0;i<n;i++)        {            scanf("%s",str);            p1=str[0]-'a';            p2=str[strlen(str)-1]-'a';            degree[p1].out++;            degree[p2].in++;            g[p1][p2]=g[p2][p1]=1;        }        memset(vis,0,sizeof(vis));        int start=0,num=0;        for(int i=0;i<N;i++)        {           if(degree[i].in||degree[i].out)           {                start=i;                num++;           }        }        node=0;        dfs(start);        if(num!=node)        {            printf("The door cannot be opened.\n");            continue;        }        int a=0,b=0,c=0,d=0;        for(int i=0;i<N;i++)        {             if(degree[i].in==0&°ree[i].out==0)                continue;                d++;             if(degree[i].in-degree[i].out==1)                a++;             else if(degree[i].in-degree[i].out==-1)                 b++;             else if(degree[i].in==degree[i].out)                 c++;        }        if((a==1&&b==1&&c==d-2)||c==d)            printf("Ordering is possible.\n");          else             printf("The door cannot be opened.\n");    }    return 0;}             

原创粉丝点击