您的位置:首页 > 其它

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

2012-08-06 23:53 225 查看
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;
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: