您的位置:首页 > 其它

POJ 1094 拓扑排序

2016-08-03 12:55 375 查看

题意大坑,建议先看Discuss……
否则代码写得就像以下的一团糟。。。。

其实并不难,拓扑排序+乱搞就可以AC。

// by SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char jy[4],vis[26],in[26],temp[26],flag,VIS[26],F,rec,G;
int first[30],next[999],v[999],tot,n,m,s[999];
void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
int main(){
while(scanf("%d%d",&n,&m)&&(n||m)){
memset(VIS,0,sizeof(VIS));
memset(in,0,sizeof(in));
memset(first,-1,sizeof(first)),tot=F=0;
for(int ii=1;ii<=m;ii++){
rec=G=0,memset(vis,0,sizeof(vis));
scanf("%s",jy);jy[0]-='A',jy[2]-='A';
if(F)continue;
add(jy[0],jy[2]),in[jy[2]]++;
VIS[jy[0]]=VIS[jy[2]]=1;
for(int i=0;i<n;i++)temp[i]=in[i];
while(1){
char minus[26];
memset(minus,0,sizeof(minus));
flag=0;
for(int i=0;i<n;i++)
if(!temp[i]&&!vis[i]&&VIS[i]){
s[rec++]=i;
if(flag)G=1;
vis[i]=flag=1;
for(int j=first[i];~j;j=next[j])minus[v[j]]++;
}
for(int i=0;i<n;i++)temp[i]-=minus[i];
if(!flag){
for(int i=0;i<n;i++)
if(VIS[i]&&temp[i]){printf("Inconsistency found after %d relations.\n",ii),F=1;goto en;}
else if(!vis[i])goto en;
if(!G){
F=1,printf("Sorted sequence determined after %d relations: ",ii);
for(int i=0;i<rec;i++)printf("%c",s[i]+'A');puts(".");
}
en:break;
}
}
if(ii==m&&!F&&G)puts("Sorted sequence cannot be determined.");
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: