topo 成绩排名

题目描述

     每到考试后,学校都会发成绩表给每个学生,但是很多同学更关心的是自己在班级里的排名,可惜排名信息并没有公开。

     小雯同学很想知道这次期末考试的全班排名情况,但是她的同学却不愿意告诉她自己的分数,只告诉她自己和班里的某某同学比分数是高还是低。现在小雯想请你帮忙分析出可能的全班的排名情况,她会告诉你哪些同学比哪些同学分数高或低。

输入输出格式

输入格式:

  第一行两个数 n,m,表示n个同学,m对同学分数比较关系。(2≤n≤100,1≤m≤1000 )
  接下来的m行,每行三个数,i,j,k,如果k为0则 i 同学的分数比 j 同学高,如果k 为1 则 i 同学分数比 j 同学分数低

输出格式:

  输出全班的考试排名情况,如果有多种可能,输出字典序最小的一组。

输入输出样例

输入样例#1:

5 5
1 4 0
2 4 0
1 3 1
4 5 1
5 2 0

输出样例#1:

3 1 5 2 4

又一道水题

按题意拓扑连边再跑模板

#include
using namespace std;
int n,m,ma[1001][1001],rudu[1001],dis[1001],ans=0,vis[1001];
priority_queue,greater >q;
int topo()
{
    for(int i=1;i<=n;i++)
    {
        if(rudu[i]==0)
        {
            q.push(i);
        }
    }
    int temp;
    while(!q.empty())
    {
        temp=q.top();
        printf("%d ",temp);
        q.pop();
        for(int i=1;i<=n;i++)
        {
            if(ma[temp][i])
            {
                rudu[i]--;
                
                if(rudu[i]==0) 
				{
					q.push(i);
				}
            }
        }
    }
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int x,y,z;
		cin>>x>>y>>z;
		if(z==1)
		{
			ma[y][x]=1;
			rudu[x]++;
		}
		else 
		{
			ma[x][y]=1;
			rudu[y]++;
		}
	}
	topo();
	return 0;
}

你可能感兴趣的:(图论,拓扑排序,算法,图论)