poj1094

#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
vector<int>G[50];
int in[50]; 
int tmp[50]; // 入度备份数组 
char out[50]; 
int topsort(int n) {
	bool zeroflag; //有多个入度为0的,即不确定拓扑排序序列 
	priority_queue <int,vector<int>,greater<int> > pq;
	for(int i=0;i<n;i++) {
		tmp[i] = in[i];
	} 
	for(int i=0;i<n;i++) { // 将入度为0的加入优先队列 
		if(!tmp[i]) {
			pq.push(i);
		}
	}
	int sum=0; // 入度为0的元素 
	while(!pq.empty())  {
		if(pq.size()>1) zeroflag = 1;
		int t = pq.top();
		pq.pop();
		out[sum] = t+'A';
		sum++;
		for(vector<int>::iterator it=G[t].begin();it!=G[t].end();it++) {
			tmp[*it]--;
			if(tmp[*it]==0) pq.push(*it);
		}
	} 
	if(sum!=n) return 1; //说明有环
	if(zeroflag) return 0; // 说明有多个入度为0 不确定
	return -1; // 说明成功 记录此时到第几条 
}

int main() {
	freopen("1.txt","r",stdin);
	int n,m;
	while(true) {
		bool circleflag=0,find=0;
		int step;
		scanf("%d %d",&n,&m);
		if(n==0&&m==0) break;
		memset(in,0,sizeof(in));
		for(int i=1;i<=m;i++) {
			char s[4];
			scanf("%s",s);
			if(circleflag==0) {
				G[s[0]-'A'].push_back(s[2]-'A'); //s[0]的后继是s[2]
				in[s[2]-'A'] += 1;
				int k = topsort(n);
				if(k==1) {
					circleflag = 1; // 说明有环
					printf("Inconsistency found after %d relations.\n",i);
					continue;
				}
				if(k==-1) {
					find = 1;
					step = i;
				}
			}
			
		}
		if(circleflag==0&&find) {
			printf("Sorted sequence determined after %d relations: ",step);
			for(int i=0;i<n;i++) {
				printf("%c",out[i]);
			}
			printf("\n");
		}
		if(!circleflag&&!find){
			printf("Sorted sequence cannot be determined.\n");
		}
	}
} 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值