- 注意三种情况的 优先级:不确定<顺序排列<矛盾
- 在入度为0的点数大于1时,第一反应是序列暂时不能确定,但还可能存在之后输入的式子与之前输入矛盾的情况!这个时候不能直接返回stata=‘不确定’!一定要把所有式子遍历完,找到是否存在矛盾!
- 最简单的思路就是把26个字符的大小情况用矩阵存储,-1表示大于,0表示未知,1表示小于。
#include <iostream>
#include <stack>
#define MAX 26
using namespace std;
char sorted[MAX+1];
int top(int n,int letter[MAX][MAX],int g[]);
int main()
{
int letter[MAX][MAX];
int n,m,state,mm;
char formula[4];
int g[MAX];
while(cin>>n>>m && n!=0 && m!=0){
state = 0;
if(m<(n-1)){
state = 2;
while(m--){
cin>>formula;
}
}
else{
for(int i=0;i<n;i++){
g[i] = 0;
for(int j=0;j<n;j++)
letter[i][j]=0;
}
bool change = false;
for(int i=0;i<m;i++){
cin>>formula;
if(state==0||state==2){
int a=formula[0]-'A';
int b=formula[2]-'A';
if(letter[a][b] != -1){
letter[a][b] = 1;
letter[b][a] = -1;
g[b]++;
state = top(n,letter,g);
}else{
state = 3;
}
}
if(!change && (state == 3)){
mm = i+1;
change = true;
}else if(!change && state == 1){
mm = i+1;
change = true;
}
}
}
switch(state){
case 1:
cout<<"Sorted sequence determined after "<<mm<<" relations: ";
for(int i=0;i<n;i++)
cout<<sorted[i];
cout<<"."<<endl;
break;
case 2:
cout<<"Sorted sequence cannot be determined."<<endl;
break;
case 3:
cout<<"Inconsistency found after "<<mm<<" relations."<<endl;
break;
default:
cout<<"WRONG"<<endl;
break;
}
}
return 0;
}
int top(int n,int letter[MAX][MAX],int g[MAX]){
stack<int> s;
int top;
int sum=0;
int ispush[MAX];
int let[MAX][MAX];
for(int i=0;i<n;i++){
ispush[i]=g[i];
for(int j=0;j<n;j++)
let[i][j]=letter[i][j];
}
for(int i=0;i<n;i++){
if(ispush[i]==0){
s.push(i);
ispush[i] = -1 ;
}
}
int flag =0;
while(!s.empty()){
if(s.size()>1)
flag = 1;
top = s.top();
s.pop();
sorted[sum++] = top+'A';
for(int i=0;i<n;i++){
if(let[top][i]==1){
ispush[i]--;
if(ispush[i]<(-1))
return 3;
let[i][top] = 0;
}
}
for(int i=0;i<n;i++){
if(ispush[i]==0){
s.push(i);
ispush[i] = -1;
}
}
}
sorted[sum] = '\0';
if(sum!=n)
return 3;
else if(flag==1)
return 2;
return 1;
}