输出的字符串中少打了一个“.”号,就被告知Wrong Answer,切记
代码如下:
#include "stdio.h"
#include "string.h"
/*DealWithLine函数的返回状态*/
#define FAIL -1
#define SUCCESS 1
#define REPEATED 0
#define NOTSURE -2
/*栈空间*/
#define STACK_SIZE 100
#define SYM_MAX_NUM 26
int stack[STACK_SIZE];
int stackTop;
/*题目的输入参数*/
int m=-1,n=-1;
int froms[SYM_MAX_NUM]; //froms[n]n的入度
int graph[SYM_MAX_NUM][SYM_MAX_NUM]; //有向图
int seq[SYM_MAX_NUM*2]; //数组设为26*2,为了避免下标越界
char line[5]; //用于保存一行关系的字符串
void push(int e){
stackTop++;
stack[stackTop]=e;
}
int pop(){
if(stackTop==-1)
return -1;
else
return stack[stackTop--];
}
int DealWithLine(){
int sym1,sym2;
int j,k,i;
int pNUM=0; //记录入度为0的点个数
int checkedPNUM=0; //记录当前已经搜索了的点个数
int notSureFlag=0; //如果在搜索过程中发现有1个以上的入度为0的点,则该标志置高
int froms_cpy[SYM_MAX_NUM]; //各点入度的备份
sym1=line[0]-0x41;
sym2=line[2]-0x41;
if(graph[sym1][sym2]==1) //重复的关系
return REPEATED;
graph[sym1][sym2]=1; //更新有向图
froms[sym2]++; //更新入度
memcpy(froms_cpy,froms,n*sizeof(int));
for(j=0;j<n;j++) //初始化栈内容,用以深度优先搜索
if(froms_cpy[j]==0){
pNUM++;
push(j);
}
if(pNUM==0) return FAIL; //入度为0的点如果没有,则意味着有闭环
if(pNUM>1) notSureFlag=1; //入度为0点大于1,则意味着有关系不确定
while(stackTop>-1){ //深度优先搜索至栈为空
int p;
pNUM=0;
p=pop();
seq[checkedPNUM]=p;
checkedPNUM++;
if(froms_cpy[p]==-1) return FAIL; //如果该点已经搜索过,说明已经形成环
froms_cpy[p]=-1; //入度为-1,标志该点已经搜索过
for(k=0;k<n;k++){
if(graph[p][k]==1){
froms_cpy[k]--; //被p点指向的点的入度减1
if(froms_cpy[k]==0){ //如果入度减1之后变成0,则将该点入栈
push(k);
pNUM++;
}
}
}
if(pNUM>1) notSureFlag=1;
}
if(checkedPNUM<n) return FAIL;
if(notSureFlag!=1) return SUCCESS;
return NOTSURE;
}
int main(){
//freopen("../POJ1094_Sorting_it_all_out/in.txt", "r", stdin);
//freopen("../POJ1094_Sorting_it_all_out/out.txt", "w", stdout);
/* 中间按原样写代码,什么都不用修改 */
while(!(m==0 && n==0)){
scanf("%d %d",&n,&m);
stackTop=-1;
memset(froms,0,SYM_MAX_NUM*sizeof(int));
memset(graph,0,SYM_MAX_NUM*SYM_MAX_NUM*sizeof(int));
int i=0;
for(i=0;i<m;i++){
scanf("%s",line);
int r=DealWithLine();
if(r==FAIL){
printf("Inconsistency found after %d relations.\n",i+1);
break;
}
else if(r==SUCCESS){
printf("Sorted sequence determined after %d relations: ",i+1);
for(int j=0;j<n;j++){
printf("%c",seq[j]+0x41);
}
printf(".\n");
break;
}
else if(r==REPEATED){
//printf("Inconsistency found after %d relations.\n",i+1);
//break;
continue;
}
else{
if(i==m-1){
printf("Sorted sequence cannot be determined.\n");
}
else{
continue;
}
}
}
while(i<m-1){
scanf("%s",line);
i++;
}
}
//fclose(stdin);
//fclose(stdout);
return 0;
}