Play on Words
2015-06-06 17:54
393 查看
http://poj.org/problem?id=1386
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
char ch[1010];
int vis[30],indot[30],outdot[30],f[30];
int find(int x)
{
if(f[x]==x)
return x;
else
{
f[x]=find(f[x]);
return f[x];
}
}
void merge(int u,int v)
{
int k1=find(u);
int k2=find(v);
if(k1!=k2)
f[k2]=k1;
}
bool judge()
{
int i,sum1,sum2,sum3;
sum1=sum2=sum3=0;
for(i=0;i<26;i++)
{
if(f[i]==i && vis[i])
sum1++;
if(abs(indot[i]-outdot[i])==1)
sum2++;
else if(indot[i]!=outdot[i])
sum3++;
}
if(sum1==1)
if((sum2==2 || sum2==0 ) && sum3==0)
return 1;
return 0;
}
int main()
{
// freopen("C:\\Users\\John\\Desktop\\hi.txt","r",stdin);
int t,i;
cin>>t;
while(t--)
{
memset(vis,0,sizeof(vis));
memset(indot,0,sizeof(indot));
memset(outdot,0,sizeof(outdot));
for(i=0;i<26;i++)
f[i]=i;
int n;
cin>>n;
while(n--)
{
cin>>ch;
vis[ch[0]-'a']=1;
int k=strlen(ch)-1;
vis[ch[k]-'a']=1;
outdot[ch[0]-'a']++;
indot[ch[k]-'a']++;
merge(ch[0]-'a',ch[k]-'a');
}
if(judge())
cout<<"Ordering is possible."<<endl;
else
cout<<"The door cannot be opened."<<endl;
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define VM 30
int indeg[VM],outdeg[VM],mat[VM][VM],start;
bool vis[VM];
void dfs (int u)
{
for (int i = 0; i < 26; i ++)
if (mat[u][i])
{
mat[u][i] = 0;
dfs(i);
}
}
bool cmp()
{
int i,k,sum1,sum2,sum3;
sum1 = sum2 = sum3 = 0;
for (i = 0; i < 26; i ++)
{
if (indeg[i] - outdeg[i] == 1)
sum1 ++;
if (outdeg[i] - indeg[i] == 1)
{
sum2 ++;
start = i;
}
if (indeg[i] == outdeg[i]&&indeg[i]!= 0)
k = i;
if (abs(indeg[i] - outdeg[i]) > 1)
sum3 ++;
}
if (sum1 > 1||sum2 > 1||sum3 > 0)
return false;
if (sum2 == 0)
start = k;
return true;
}
int main ()
{
int T,n;
bool flag;
char str[1005];
scanf ("%d",&T);
while (T --)
{
scanf ("%d",&n);
memset (indeg,0,sizeof(indeg));
memset (outdeg,0,sizeof(outdeg));
memset (mat,0,sizeof(mat));
memset (vis,false,sizeof(vis));
while (n --)
{
scanf ("%s",str);
int len = strlen(str);
int u = str[0]-'a';
int v = str[len-1]-'a';
mat[u][v] = 1;
indeg[v] ++;
outdeg[u] ++;
}
flag = false;
if (cmp ())
{
flag = true;
dfs(start);
for (int i = 0; i < 26; i ++)
for (int j = 0; j < 26; j ++)
if (mat[i][j])
{
flag = false;
break;
}
}
if (flag)
printf ("Ordering is possible.\n");
else
printf ("The door cannot be opened.\n");
}
return 0;
}
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
char ch[1010];
int vis[30],indot[30],outdot[30],f[30];
int find(int x)
{
if(f[x]==x)
return x;
else
{
f[x]=find(f[x]);
return f[x];
}
}
void merge(int u,int v)
{
int k1=find(u);
int k2=find(v);
if(k1!=k2)
f[k2]=k1;
}
bool judge()
{
int i,sum1,sum2,sum3;
sum1=sum2=sum3=0;
for(i=0;i<26;i++)
{
if(f[i]==i && vis[i])
sum1++;
if(abs(indot[i]-outdot[i])==1)
sum2++;
else if(indot[i]!=outdot[i])
sum3++;
}
if(sum1==1)
if((sum2==2 || sum2==0 ) && sum3==0)
return 1;
return 0;
}
int main()
{
// freopen("C:\\Users\\John\\Desktop\\hi.txt","r",stdin);
int t,i;
cin>>t;
while(t--)
{
memset(vis,0,sizeof(vis));
memset(indot,0,sizeof(indot));
memset(outdot,0,sizeof(outdot));
for(i=0;i<26;i++)
f[i]=i;
int n;
cin>>n;
while(n--)
{
cin>>ch;
vis[ch[0]-'a']=1;
int k=strlen(ch)-1;
vis[ch[k]-'a']=1;
outdot[ch[0]-'a']++;
indot[ch[k]-'a']++;
merge(ch[0]-'a',ch[k]-'a');
}
if(judge())
cout<<"Ordering is possible."<<endl;
else
cout<<"The door cannot be opened."<<endl;
}
return 0;
}
////////////////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define VM 30
int indeg[VM],outdeg[VM],mat[VM][VM],start;
bool vis[VM];
void dfs (int u)
{
for (int i = 0; i < 26; i ++)
if (mat[u][i])
{
mat[u][i] = 0;
dfs(i);
}
}
bool cmp()
{
int i,k,sum1,sum2,sum3;
sum1 = sum2 = sum3 = 0;
for (i = 0; i < 26; i ++)
{
if (indeg[i] - outdeg[i] == 1)
sum1 ++;
if (outdeg[i] - indeg[i] == 1)
{
sum2 ++;
start = i;
}
if (indeg[i] == outdeg[i]&&indeg[i]!= 0)
k = i;
if (abs(indeg[i] - outdeg[i]) > 1)
sum3 ++;
}
if (sum1 > 1||sum2 > 1||sum3 > 0)
return false;
if (sum2 == 0)
start = k;
return true;
}
int main ()
{
int T,n;
bool flag;
char str[1005];
scanf ("%d",&T);
while (T --)
{
scanf ("%d",&n);
memset (indeg,0,sizeof(indeg));
memset (outdeg,0,sizeof(outdeg));
memset (mat,0,sizeof(mat));
memset (vis,false,sizeof(vis));
while (n --)
{
scanf ("%s",str);
int len = strlen(str);
int u = str[0]-'a';
int v = str[len-1]-'a';
mat[u][v] = 1;
indeg[v] ++;
outdeg[u] ++;
}
flag = false;
if (cmp ())
{
flag = true;
dfs(start);
for (int i = 0; i < 26; i ++)
for (int j = 0; j < 26; j ++)
if (mat[i][j])
{
flag = false;
break;
}
}
if (flag)
printf ("Ordering is possible.\n");
else
printf ("The door cannot be opened.\n");
}
return 0;
}
相关文章推荐
- javascript中window的弹框用法
- Hadoop之hive学习
- Duilib扩展《01》— 双击、右键消息扩展
- 计算器
- nginx支持url的PATHINFO
- Maximum Depth of Binary Tree
- Delphi XE8中的DBExpress使用ODBC方式连接MySQL 5.6.24 X64!!!!
- 协方差矩阵与主成分分析(PCA)
- 百度之星第一场初赛部分题解
- 《自己动手写框架7》:关于框架体系与战术的思考
- Delphi XE8中的DBExpress使用ODBC方式连接MySQL 5.6.24 X64!!!!
- Windows 上安装 Jekyll
- AngularJS(一)——从零开始AngularJS
- 图
- 协方差矩阵
- 索引的作用
- libevent参考手册8
- libevent参考手册7
- 【.a】静态库文件的认识
- 修改mysql配置的影响