(topo)Sorting it all out(P1094)

这个题就是想要练一下TOPO图的排序,可是一直对题意有误差,最后在discuss里看得到了灵感,,,,逻辑顺序很重要啊,

做了几个小时,,值得表扬,,


#include<iostream>
#include<cstdio>
#include<cstring> 
#include<algorithm>   
#include<queue>
#include<cstdlib>
using namespace std; 

#define N 27

int n,m;
int tt;
int map[N][N];
int c[N];
int topo[N];
int t;
int ans=0;
int pre[N][N];
int d[N];
queue<int> q;

bool dfs(int u)
{
//	printf("%c",u+'A');
	c[u]=-1;
	q.push(u);
	for (int v=0;v<n;v++)  if (map[u][v])          
	{
	//	cout<<u<<' '<<v<<endl;
		
		if (c[v]<0)
		{
			
			return false;
		}
		else if (!c[v]&&!dfs(v))
			return false;
	}
	q.pop();
	c[u]=1;
	topo[--t]=u;
	return true;
}

bool toposort()
{
	t=n;
	
	//for (tt=2;tt<=m;tt++)
	{
		memset(c,0,sizeof(c));
		//cout<<tt<<endl;
	for (int u=0;u<n;u++)

	{
		if (!c[u])
			if (!dfs(u))
			{
			
				return false;
			}
		//cout<<endl;
	}
	}
	return true;
}

int main()
{
	freopen("fuck.txt","r",stdin);
	int i,j,k;
	while (cin>>n>>m,n)
	{
		//cout<<n<<endl;
		char a,b;
		memset(map,0,sizeof(map));
		//memset(d,0,sizeof(d));
		memset(pre,-1,sizeof(pre));
		j=1;
		tt=2;
		k=m;
		int flag=0;
		for (m=1;m<=k;m++)   //这里就是要输入一个字符串就要判断一次,不然逻辑上很复杂.易出错.
		{
			cin>>a>>b>>b;
			if (flag)
				continue;
			//cout<<m<<endl;
			map[a-'A'][b-'A']=1;
			d[a-'A']=1;
			d[b-'A']=1;
			if (pre[a-'A'][b-'A']==-1)
			pre[a-'A'][b-'A']=j;      //这里没有用,,是刚开始的时候想的.
			j++;
		
		
		if (toposort())   //没有回路
		{
			if (t)            //多余
				continue;
			
			for (i=0;i<n-1;i++)    //判断是否唯一,,,自己临时想出的哦,鼓掌
			{
				if (!map[topo[i]][topo[i+1]])
					break;
			}
			if (i<n-1)     
				continue;
			//cout<<"   "<<i<<endl;

			flag=1;
	
			printf("Sorted sequence determined after %d relations: ",m);
			for (i=0;i<n;i++)
			{
				printf("%c",'A'+topo[i]);
			}
			printf(".\n");
		}
		else    //有回路时输出
		{

				flag=1;
				printf("Inconsistency found after %d relations.\n",m);
		}
		//cout<<map['L'-'A']['H'-'A']<<endl;
		}
		if (!flag)
			printf("Sorted sequence cannot be determined.\n");
	}
	return 0;
}


Sorting It All Out
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 20160 Accepted: 6914

Description

An ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to largest. For example, the sorted sequence A, B, C, D implies that A < B, B < C and C < D. in this problem, we will give you a set of relations of the form A < B and ask you to determine whether a sorted order has been specified or not.

Input

Input consists of multiple problem instances. Each instance starts with a line containing two positive integers n and m. the first value indicated the number of objects to sort, where 2 <= n <= 26. The objects to be sorted will be the first n characters of the uppercase alphabet. The second value m indicates the number of relations of the form A < B which will be given in this problem instance. Next will be m lines, each containing one such relation consisting of three characters: an uppercase letter, the character "<" and a second uppercase letter. No letter will be outside the range of the first n letters of the alphabet. Values of n = m = 0 indicate end of input.

Output

For each problem instance, output consists of one line. This line should be one of the following three:

Sorted sequence determined after xxx relations: yyy...y.
Sorted sequence cannot be determined.
Inconsistency found after xxx relations.

where xxx is the number of relations processed at the time either a sorted sequence is determined or an inconsistency is found, whichever comes first, and yyy...y is the sorted, ascending sequence.

Sample Input

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

Sample Output

Sorted sequence determined after 4 relations: ABCD.
Inconsistency found after 2 relations.
Sorted sequence cannot be determined.

Source




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值