CF510C Fox And Names——拓扑排序练习
省委代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#define maxn 100
#define maxm 10000
using namespace std;
struct edge{
int next,to;
}e[maxm];
int point[maxn],cnt;
int l,r,q[maxn],in[maxn];
char s[110][110];
void addedge(int x,int y)
{
e[++cnt].next=point[x];
e[cnt].to=y;
point[x]=cnt;
}
void toposort()
{
l=r=0;
for(int i=0;i<26;i++)
if(in[i]==0)
q[++r]=i;
while(l<r)
{
int x=q[++l];
for(int i=point[x];i;i=e[i].next)
{
int y=e[i].to;
in[y]--;
if(in[y]==0)
q[++r]=y;
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%s",s[i]);
for(int i=1;i<n;i++)
{
int len1=strlen(s[i]);
int len2=strlen(s[i+1]);
bool flag=0;
for(int j=0;j<min(len1,len2);j++)
if(s[i][j]==s[i+1][j])
continue;
else
{
flag=1;
in[s[i+1][j]-'a']++;
addedge(s[i][j]-'a',s[i+1][j]-'a');
break;
}
if(flag==0 && len2<len1)
{
printf("Impossible");
return 0;
}
}
toposort();
if(l<26)
printf("Impossible");
else
for(int i=1;i<=26;i++)
printf("%c",q[i]+'a');
return 0;
}
作者&出处:ShineEternal
本文阅读完毕欢迎到此留言:link
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.
你看地这么津津有味,不点个赞再走吗QAQ