拓扑排序(确定比赛名次)

题目链接:https://vjudge.net/contest/244053#problem/A

 确定比赛名次

有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。 

Input

输入有若干组,每组中的第一行为二个数N(1<=N<=500),M;其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1,P2表示即P1队赢了P2队。 

Output

给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。 

其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。 

Sample Input

4 3
1 2
2 3
4 3

Sample Output

1 2 4 3

参考代码:

#include <bits/stdc++.h>
const int maxn=1e3+10;
int p[maxn][maxn],vis[maxn];//p记录两点是否相连,vis记录点的入度
int n,m;
int flag[maxn][maxn];
void toposort()
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(!vis[j])//如果入度为0(没有前驱点)
			{
				vis[j]--;//入度变成-1进行标记(入度为-1的点均为已经删除的点)
				printf("%d",j);//输出该节点
				if(i!=n)
					printf(" ");
				else
					printf("\n");
				for(int k=1;k<=n;k++)
				{
					if(p[j][k])
						vis[k]--;//将与j相连的节点都删去(删除与j有关的边)
				}
				break;
			}
		}
	}
}
int main(int argc, char const *argv[])
{
	int x,y;
	while(~scanf("%d%d",&n,&m))
	{
		memset(p,0,sizeof(p));
		memset(vis,0,sizeof(vis));
		for(int i=1;i<=m;i++)
		{
			scanf("%d%d",&x,&y);
			//对数据进行处理,如果两点相连,p[x][y]=1,y的入度增加1
			if(!p[x][y])
			{
				p[x][y]=1;
				vis[y]++;
			}
		}
		toposort();
	}
	return 0;
}

本人代码:

扫描二维码关注公众号,回复: 2707831 查看本文章
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int maxn=1e3+10;
int vec[maxn][maxn];
int vis[maxn];
queue <int> que;
int n,m;
void toposort(){
	for(int i=1;i<=m;i++){
		for(int j=1;j<=m;j++){
			if(vis[j]==0){
				vis[j]=-1;
				que.push(j);
				for(int k=1;k<=m;k++){
					if(vec[j][k]){
						vis[k]--;
					}
				}
				break;
			}
		}
	}
}

int main(){
	while(cin>>m>>n){

	int x;
	int y;
	memset(vis,0,sizeof(vis));
	memset(vec,0,sizeof(vec));
	for(int i=0;i<n;i++){
		scanf("%d%d",&x,&y);
		if(vec[x][y]==0){
			vec[x][y]=1;
			vis[y]++;
		}
	
	}
	toposort();
	cout<<que.front();
	que.pop();
	while(!que.empty()){
		int x=que.front();
		printf(" %d",x);
		que.pop();
	}
	puts("");
}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/guozuofeng/article/details/81414808
今日推荐