思路:本题是确定比赛次序,可以将输入的a b看作是一条a-->b的有向边,因此可以构建一个有向图,使用拓扑排序来做。
//1.本题中要求名次相同时较小的排列在前面,则可以使用优先队列
//2.使用优先队列时要包含头文件queue
//3.优先队列关键字是priority_queue
//4.优先队列默认使用<操作运算符,即较大者优先级高先出队列 ,若要使用>,
//则要使用priority_queue<int, vector<int>, greater<int> > q;
#include <stdio.h>
#include <queue>
#include <string.h>
#include <vector>using namespace std;
priority_queue<int, vector<int>, greater<int> > Q; //优先队列
vector<int> edge[501]; //存储边
int inDegree[501];
int main()
{
int n, m, a, b;
while(~scanf("%d %d", &n, &m))
{
memset(inDegree, 0, sizeof(inDegree));
for(int i = 1; i <= n; i++)
edge[i].clear(); //清空邻接链表
for(int i = 0; i < m; i++)
{
scanf("%d %d", &a, &b);
edge[a].push_back(b); //加入一条由a-->b的边
inDegree[b]++;
}
for(int i = 1; i <= n; i++)
if(!inDegree[i])
Q.push(i);
int cur;
bool flag = true;
while(!Q.empty())
{
cur = Q.top();
Q.pop();
if(flag)
{
printf("%d", cur);
flag = false;
}
else
printf(" %d", cur);
for(int i = 0; i < edge[cur].size(); i++)
{
inDegree[edge[cur][i]]--; //去除边cur-->i,将i的入度减一
if(inDegree[edge[cur][i]] == 0)
Q.push(edge[cur][i]);
}
}
printf("\n");
}
return 0;
}