您的位置:首页 > 编程语言 > C语言/C++

POJ 1094 C++:Sorting It All Out

2017-01-03 12:43 295 查看

思路:

拓扑排序的思想,比较麻烦的一点是没输入一行关系就需要调用函数判断一次,每次找到入度为0的点,如果没有这样的点,那么说明存在环,如果有多个,无法判断关系但是还可能是存在环,找到入度为0的一个点之后,删除这个点和它所连接的边,注意:每次只能删除一个点,如果一次删除多个点,那么flag可能一直为0,无法判断flag=3的情况。反例:A<B  A<C,
#include <stdio.h>
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
int m,n;
int a[30][30];
queue<int> res;
int judge(){

queue<int>  re;
int in[30]={0};
int aa[30][30];
memcpy(aa,a,sizeof(a));
int i,k,j;
for(i=0;i<m;i++){
for(k=0;k<m;k++){
if(aa[i][k]==1){
in[k]++;
}

}
}
int flag=0;
for(k=0;k<m;){

int count=0;
for(i=0;i<m;i++){
if(in[i]==0)count++;
}
if(count==0)return 2;
if(count>1)flag=3;
for(i=0;i<m;i++){
if(in[i]==0){
k++;
re.push(i);
for(j=0;j<m;j++){
if(aa[i][j]){
aa[i][j]=0;
in[j]--;
}
}
in[i]=-1;
break;
}
}
}
if(flag!=3){
res=re;
return 1;
}
else return 3;

}
int main(){
while(cin>>m>>n){
if(m==0&&n==0)break;
memset(a,0,sizeof(a));
int i,j,flag=0;
char r,l;
for(i=0;i<n;i++){
cin>>r>>l>>l;
a[r-'A'][l-'A']=1;
if(flag==1||flag==2)continue;
flag=judge();
if(flag==1){
cout<<"Sorted sequence determined after "<<i+1<<" relations: ";
while(!res.empty()){
int t=res.front();
res.pop();
cout<<(char)('A'+t);
}
cout<<"."<<endl;

}
if(flag==2)cout<<"Inconsistency found after "<<i+1<<" relations."<<endl;

}
if(flag==3)cout<<"Sorted sequence cannot be determined."<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 拓扑排序 poj