您的位置:首页 > 其它

拓扑排序,poj 1094

2011-07-12 22:00 225 查看

//拓扑排序,poj 1094

//题意:就是判断他给你的逻辑关系中有没有矛盾,或关系不能确定,还是能确定。。。拓扑排序。。。

//不过是要加入一个关系判断一次,首先会发现不能确定的关系只能最后判断,而矛盾和关系确定就要一边加,一边判断。。。

//三种情况1:无入度为0的点,有环;2:入度为0的点每次只有一个,则关系确定;3到最后前两种关系都没有出现;

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
bool gp[30][30];
char vd[30];
int into[30],flag;
int find_huan(int n){
int i,j,k=-1;
for(i=0;i<n;i++){
if(!into[i]){
if(k==-1){
k=i;
}
else
flag=1;
}
}
return k;
}
int topsort(int n){
int i,j,k;flag=0;
memset(vd,'\0',sizeof(vd));
memset(into,0,sizeof(into));
for(i=0;i<n;i++)
for(j=0;j<n;j++){
if(gp[i][j])
into[j]++;
}
for(i=0;i<n;i++){
k=find_huan(n);
if(k==-1)
return 0;
into[k]=-1;
vd[i]=k+'A';
for(j=0;j<n;j++){
if(gp[k][j])
into[j]--;
}
}
if(!flag)
return 2;
else
return 1;
}
int main(){
int i,j,k,n,m,x,y,lg;
char s[5];
while(1){
cin>>n>>m;
lg=0;
if(!n&&!m)
return 0;
memset(gp,0,sizeof(gp));
for(i=0;i<m;i++){
scanf("%s",s);
if(lg)
continue;
getchar();
x=s[0]-'A';
y=s[2]-'A';
gp[x][y]=1;
k=topsort(n);
if(k==0){
printf("Inconsistency found after %d relations.\n",i+1);
lg=1;
}
else
if(k==2){
printf("Sorted sequence determined after %d relations: %s.\n",i+1,vd);
lg=1;
}
}
if(lg==0){
printf("Sorted sequence cannot be determined.\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ini