题目描述
每到考试后,学校都会发成绩表给每个学生,但是很多同学更关心的是自己在班级里的排名,可惜排名信息并没有公开。
小雯同学很想知道这次期末考试的全班排名情况,但是她的同学却不愿意告诉她自己的分数,只告诉她自己和班里的某某同学比分数是高还是低。现在小雯想请你帮忙分析出可能的全班的排名情况,她会告诉你哪些同学比哪些同学分数高或低。
输入输出格式
输入格式:
第一行两个数 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<bits/stdc++.h>
using namespace std;
int n,m,ma[1001][1001],rudu[1001],dis[1001],ans=0,vis[1001];
priority_queue<int,vector<int>,greater<int> >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;
}