POJ1094(拓扑排序)

依次读入边,每次读入之后都做一次拓扑排序,来判断是否有环或者已经确定序列。

题意有些混淆人,每次读入都要判断 ①是否有环②是否已经确定序列。

上述两个条件若有一个满足则立即输出,后面的边都可以不管了。

比如这组测试数据:

2 2
A<B
B<A
0 0
Sorted sequence determined after 1 relations: AB.

在第一条边的时候已经确定了序列,即使是后面成环也无关紧要了。

当所有的边读完后都没有环也不能确定序列的话,就输出Sorted sequence cannot be determined。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <stack>
using namespace std;
int main()
{
	int n,m;
  while (1)
  {
  	int i,j;
  	int edge[100][100]={{0}};
  	int degree[100]={0};
  	int temp_degree[100];
  	stack<int> S;
  	int flag=0;

  	scanf("%d%d",&n,&m);
  	getchar();
  	if (n==0 && m==0)
  		break;
  	for (i=0;i<=m-1;i++)
  	{
    	char str[100];
    	int length=0;
  		char a,b;
  		int undetermined=0;
    	int counter=0;
  		scanf("%c<%c",&a,&b);
  		getchar();
  		if (!edge[a-'A'][b-'A'])
  			degree[b-'A']++;
  		edge[a-'A'][b-'A']=1;

  		if (flag)
  			continue;

  		for (j=0;j<=n-1;j++)
  		{
  			if (!degree[j])
  				S.push(j);
  		}

  		memcpy(temp_degree,degree,sizeof(degree));

  		int k;
  		for (k=0;k<=n-1 && !S.empty();k++)
  		{
  			if (S.size()>1)
  			  undetermined=1;
  			int top=S.top();
  			S.pop();
  			str[length++]=top+'A';
  			str[length]='\0';
  			counter++;
  			for (j=0;j<=n-1;j++)
  				if (edge[top][j] && (--temp_degree[j])==0 )
  					S.push(j);
  		}

  		if (i==m-1 && undetermined==1)
  		{
  			printf("Sorted sequence cannot be determined.\n");
  		}
  		else if (counter==n && S.empty() && !undetermined)
  		{
  			flag=1;
  			printf("Sorted sequence determined after %d relations: %s.\n",i+1,str);
  		}
  		else if (counter!=n)
  		{
  			flag=1;
  			printf("Inconsistency found after %d relations.\n",i+1);
  		}
  	}

  }
	return 0;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值