poj1094注意事项

输出的字符串中少打了一个“.”号,就被告知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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值