拓扑排序 poj1094

此题题目有点小问题,那也是很多人AC不了的原因: 
    问题是,当给定的前k项条件能够确定出大小顺序时,即便k项之后出现了矛盾条件,输出也应该是Sorted sequence determined after k relations 后面再输出排序好的序列!
#include <iostream>
#include <queue>
using namespace std;

#define SIZE 27

int inDegree[SIZE];
int graph[SIZE][SIZE];
int list[SIZE];
int map[SIZE];

int top_sort( int n )
{
	int i,v,count = 0,temp[SIZE];
	bool multi = false;
    queue <int> q; 
	
    memcpy(temp,inDegree,sizeof(temp));
	for ( i = 1; i <= n; i++ )
		if ( temp[i] == 0 )
			q.push(i);
		
		while( !q.empty() )
		{
			v = q.front();
			list[++count] = v;
			q.pop();

			if (!q.empty()) multi = true;
           
			for ( i = 1; i <= n; i++ )
			{
				if ( graph[v][i] )
					if ( --temp[i] == 0 )
						q.push(i);
			}
		}
		if (count != n) return 2; 
		if (multi) return 1;
		else return 0;//determined
}
int main()
{
	int veSta,veEnd,n,m,i,result,mark0,mark2,shown_vertex;
	bool incon,deter;
    char l,ch,r;
	
	while ( cin >> n >> m )
	{
		if ( !m && !n ) break;
		memset(graph,0,sizeof(graph));
		memset(inDegree,0,sizeof(inDegree));
		memset(map,0,sizeof(map));
		incon = false;
		deter = false;
		mark0 = 0;
		mark2 = 0;
		shown_vertex = 0;
		for ( i = 1; i <= m; i++ )
		{
			cin >> l >> ch >> r;
			veSta = l-'A'+1;
			veEnd = r-'A'+1;
			if ( !graph[veSta][veEnd] )
			{
			graph[veSta][veEnd] = 1;
			inDegree[veEnd]++;
			}
			
			if (!map[veSta] && shown_vertex < n)
			{
		               shown_vertex++;
                       map[veSta] = 1;
			}
			if (!map[veEnd] && shown_vertex < n)
			{
			           shown_vertex++;
					   map[veEnd] = 1;
			}
			if ( !incon && !deter ){
				if ( graph[veEnd][veSta] == 1 )
				{
					incon = true;
					mark2 = i;
				}
				else {
					if ( shown_vertex == n )
					{
						result = top_sort(n);
						if ( result == 1 )
							continue;
						else if ( result  == 0 )
						{
								mark0 = i;
								deter = true;
						}
						else if ( result == 2 )
						{
								mark2 = i;
								incon = true;
						}
					}
				}
			}
		}
		
		if ( incon )
			cout << "Inconsistency found after " << mark2 << " relations." << endl;
		else if ( deter ){
			cout << "Sorted sequence determined after "<< mark0 << " relations: ";
			for ( i = 1; i <= n; i++ )
				cout << (char)('A'+list[i]-1);
			cout << '.' << endl;
		}
		else 
			cout << "Sorted sequence cannot be determined." << endl;
	}
	return 0;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值