题意:给出一些由字符表示的不等式,输出字符能够递增排列或者不等式不成立的轮次,如果最终都不能判断出来,单独输出。
思路:对于每个不等式输入,在图中添加一条边,做一次拓扑排序。
输入:
4 6
A<B
A<C
B<C
C<D
B<D
A<B
3 2
A<B
B<A
26 1
A<Z
0 0
Sorted sequence determined after 4 relations: ABCD.
Inconsistency found after 2 relations.
Sorted sequence cannot be determined.
#include <stdio.h>
#include <string.h>
#define N 26
char s[5];
int n,m;
struct edge{
int y,next;
}e[N*N];
int first[N],in[N],indegree[N],res[N],top,num;
void add(int x,int y){
e[top].y = y;
e[top].next = first[x];
first[x] = top++;
}
int topsort(){
int i,j,loop = n,flag=1;
memset(res,0,sizeof(res));
num = 0;
for(i = 0;i<n;i++)
in[i] = indegree[i];
while(loop--){
int now = -1;
for(i = 0;i<n;i++)
if(!in[i]){
if(now == -1)
now = i;
else{//如果有两个点入度为0,则目前不能判断,但可能有冲突了
flag = 0;
break;
}
}
if(now == -1)//没有找到入度为0的点,有冲突
return -1;
res[num++] = now;//记录序列
in[now] = -1;
for(j = first[now];j!=-1;j=e[j].next)
in[e[j].y]--;
}
if(!flag)
return 0;
return 1;
}
int main(){
freopen("a.txt","r",stdin);
while(scanf("%d %d",&n,&m) &&n&&m){
int i,j,flag = 1;
memset(indegree,0,sizeof(in));
memset(first,-1,sizeof(first));
top = 0;
for(i = 1;i<=m;i++){
scanf("%s",s);
indegree[s[2]-'A']++;
add(s[0]-'A',s[2]-'A');
if(flag && topsort() == 1){
flag = 0;
printf("Sorted sequence determined after %d relations: ",i);
for(j = 0;j<num;j++)
printf("%c",'A'+res[j]);
printf(".\n");
}else if(flag && topsort() == -1){
flag = 0;
printf("Inconsistency found after %d relations.\n",i);
}
}
if(flag)
printf("Sorted sequence cannot be determined.\n");
}
return 0;
}