AgPro

导航

拓扑排序的模板

//拓扑排序的模板
#include <iostream>
using namespace std;

struct data 
{ 
	int in;   // 某点的入度
	int out;  // 某点的出度
}s[]; 

int a,b,n,stk[]; 
bool visited[];
bool map[][]; 

int calc()
{
	int i,j;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			if(map[i][j]) 
			{
				s[i].out++;
				s[j].in++;				
			}
		}
	}

	for(i=0;i<n;i++) 
		if( s[i].in + s[i].out != n-1 ) 
			return 0;

	return 1;
}

void push(int k); 
{ 
	stk[++top] = k; 
} 


void toplogical_sort() 
{ 
	int i,j; 
	bool flg = 1;
	int zerop;
	for(i=1;i<=n;i++) 
	{
		if(!s[i].in) 
		{
			zerop = i;
			break;
		}
	}
	memset(visited,false,sizeof(visited));
	while(flg) 
	{ 
		flg = 0; 
		for(i=1;i<=n;i++) 
		{
			if ( !visited[i] )
			{
				if (map[zerop][i])
				{
					s[i].in--;
				}
				if ( s[i].in == 0 )
				{
					zerop = i;
					flg = 1;
				}
			}
		}
	} 
} 

void Output()           //输出拓扑排序的结果
{ 
	int i; 
	for(i=1;i<=top;i++) 
		cout << stk[i] << " ";
	cout << endl;
} 

int main() 
{ 
	memset(map,0,sizeof(map)); 
	memset(s,0,sizeof(s)); 
	for(i=1;i<=n;i++) 
	{ 
		cin >> a >> b;
		s[a].out++; 
		s[b].in++; 
		map[a][b] = 1; 
	} 
	top = 0; 
	calc();
	toplogical_sort(); 
	Output(); 

	return 0; 
} 

posted on 2010-06-22 16:04  AgPro  阅读(828)  评论(0编辑  收藏  举报