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;}