poj 1094 (拓撲排序)

題意:給出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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章