杭电ACM 1285 确定比赛名次(拓扑排序)

http://acm.hdu.edu.cn/showproblem.php?pid=1285

这里用到了网上找的的拓扑排序的模版。

map[i][j]存放有向图的起点i和终点j之间是否连线,=1连线,=0为空。

结果的顺序存放在res数组里面。

d[i]表示第i个元素的入度,

1)入度为零即表示可以读;

2)有多个入度为零的点则最终顺序不唯一;

3)不存在入度为零的点则顺序不能确定。

这道题不用考虑有环的情况。

#include <iostream>
using namespace std;
#define MAX 510
int map[MAX][MAX];  //图 
int res[MAX];  // 存放结果 

int TopSort(int n,int mat[MAX][MAX],int* res)
{ 
    int d[MAX],i,j,k; 
    for (i=0;i<n;i++) 
        for (d[i]=j=0;j<n;d[i]+=mat[j++][i]); 
    for (k=0;k<n;res[k++]=i)   
    { 
        for (i=0;d[i]&&i<n;i++); 
        if (i==n)  
            return 0; 
        for (d[i]=-1,j=0;j<n;j++)  
            d[j]-=mat[i][j];
    } 
    return 1;
}

int main(){
	int N,M;
	int a,b;
	while(cin>>N>>M){
		if(N==0&&M==0) break;
		memset(map,0,sizeof(map));
		for(int i=0;i<M;i++){
			cin>>a>>b;
			map[a-1][b-1]=1;
		}
		TopSort(N,map,res);
		for(int i=0;i<N;i++){
			cout<<res[i]+1;
			if(i!=N-1) cout<<" "; 
		}
		cout<<endl;
	}
} 

    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/xujinsmile/article/details/7837301
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞