现在的位置: 首页 > 算法 > 正文

poj 1094 (拓扑排序)

2018年12月30日 算法 ⁄ 共 1142字 ⁄ 字号 评论关闭

题意:给出n个字母的一些大小关系,判断能否拓扑排序或者出现了矛盾,如果是这两种情况要求出到第几组关系时就可以得到。否            则就是所给数据不完全。

思路:每读一组关系进行一次拓扑排序,如果排序成功或者出现矛盾记录第几组关系之后就不拓扑排序了,直接读完数据就行了。




#include<stdio.h>
#include<string.h>
#include<stack>
const int N=30;
using namespace std;
int map[N][N],insep[N],num,p[N],indep[N],cp[N],n,k;
int tuopusort()
{
	int dep[N],i,u,pp=0;	k=0;
	memcpy(dep,indep,sizeof(indep));
	stack<int>Q;
	for(i=1;i<=n;i++)
		if(dep[i]==0)Q.push(i);		
		while(!Q.empty())
		{
			if(Q.size()>1)pp=-1;
			u=Q.top();
			Q.pop();
			p[k++]=u;
			for(i=1;i<=n;i++)
			{
				if(map[u][i]==1)
					if(--dep[i]==0)
						Q.push(i);
			}
		}
		if(k!=n) return 0;//有环
		else if(pp==-1)return -1;//排序不唯一
		else return 1;//排序唯一
		
}
int main()
{
	int m,i,x,y,sum,flag,j;
	char str[10];
	while(scanf("%d%d",&n,&m)!=-1&&n+m)
	{
		flag=-1;j=-1;sum=0;
		memset(map,0,sizeof(map));
		memset(indep,0,sizeof(indep));
		memset(cp,0,sizeof(cp));
		for(i=1;i<=m;i++)
		{
			scanf("%s",str);
			x=str[0]-'A'+1;
			y=str[2]-'A'+1;
			map[x][y]=1;
			indep[y]++;
			if(flag==-1)
			{
				flag=tuopusort();
				j=i;
			}
		}
		if(flag==-1){printf("Sorted sequence cannot be determined.\n");continue;}
		else if(flag==1)
		{
			printf("Sorted sequence determined after %d relations: ",j);
			for(i=0;i<k;i++)
				printf("%c",'A'+(p[i]-1));
			printf(".\n");
		}
		else printf("Inconsistency found after %d relations.\n",j);
	}
	return 0;
}

【上篇】
【下篇】

抱歉!评论已关闭.