poj1094 拓扑序

时间:2022-12-10 23:35:34

题意:现在有多个大写字母(不一定连续),给出字母之间的大小关系,问到第几个关系时就能判断有唯一大小排序或出现矛盾,或是有多个合理排序,若有唯一排序,则输出它。

拓扑序,只不过坑爹的是如果关系处理到一半就已经能确定序列了,即使后面的关系出现矛盾也不用管了,直接可以输出可行。其他的就是做拓扑排序了,只不过要每次加入一组关系之后做一次拓扑序。

 #include<stdio.h>
#include<string.h>
#include<queue>
using namespace std; int id[],ma[][],n,tmp[],ans[]; int topo(){
memcpy(tmp,id,sizeof(tmp));
queue<int>q;
for(int i=;i<=n;++i)if(!tmp[i])q.push(i);
int cnt=;
bool f=;
while(!q.empty()){
int u=q.front();
q.pop();
ans[++cnt]=u;
if(!q.empty())f=;
for(int i=;i<=n;++i){
if(i!=u&&ma[u][i]){
tmp[i]--;
if(!tmp[i])q.push(i);
}
}
}
if(cnt!=n)return ;
if(f)return ;
return -;
} char s[]; int main(){
int m;
while(scanf("%d%d",&n,&m)!=EOF&&n+m){
bool f=;
memset(id,,sizeof(id));
memset(ma,,sizeof(ma));
for(int i=;i<=m;++i){
scanf("%s",s);
if(f)continue;
int a=s[]-'A'+;
int b=s[]-'A'+;
ma[a][b]=;
id[b]++;
int ff=topo();
if(!ff){
printf("Inconsistency found after %d relations.\n",i);
f=;
}
else if(ff==){
printf("Sorted sequence determined after %d relations: ",i);
for(int j=;j<=n;++j)printf("%c",'A'+ans[j]-);
printf(".\n");
f=;
}
}
if(!f)printf("Sorted sequence cannot be determined.\n");
}
return ;
}