P1960 郁闷的记者
题目描述
你是一个体育报社的记者,你接受到一个艰难的任务:有 NNN 支足球队参加足球比赛,现在给你一些比赛的结果,需要你给出各支球队的排名,从 111 到 NNN。
以下是给你的一些信息:
- 没有平局;
- 不同的球队排名不能相同;
- 对于所有满足 1≤a<b≤N1 \le a<b \le N1≤a<b≤N,第 aaa 名的球队一定可以打败第 bbb 名的球队。
给你部分比赛结果,要求给出排名,并且判断是否存在另一种排名方法满足给你的比赛结果。
输入格式
第一行输入 N(1≤N≤5000)N(1 \le N \le 5000)N(1≤N≤5000),表示球队的数量,编号为 111 到 NNN。
第二行输入 M(1≤M≤100,000)M(1 \le M \le 100,000)M(1≤M≤100,000),表示给出的比赛场数。
接下来 MMM 行,每行两个整数 XiX_iXi,YiY_iYi,表示 XiX_iXi 能打败 YiY_iYi。
输出格式
输出包含 N+1N+1N+1 行,前 NNN 行描述球队的排名,第 iii 个数表示第 iii 名的球队,第 N+1N+1N+1 行包含一个整数,如果为 000 表示不存在其他的排名方法,如果为 111 表示还有其他的排名方法。
输入输出样例 #1
输入 #1
3
2
2 1
2 3
输出 #1
2
1
3
1
说明/提示
【数据范围】
30%30\%30% 的数据满足:1≤N≤71 \le N \le71≤N≤7,1≤M≤151 \le M \le 151≤M≤15
60%60\%60%的数据满足:1≤N≤1001 \le N \le 1001≤N≤100,1≤M≤20001 \le M \le 20001≤M≤2000
100%100\%100% 的数据满足:1≤N≤50001 \le N \le 50001≤N≤5000,1≤M≤1000001 \le M \le 1000001≤M≤100000
本题已加入spj,如果输出的最后一行错误将会提示 Your decide is wrong!
如果存在多种排名情况,排名错误将会提示 Wrong ranks!
如果情况固定且您的答案错误将会提示 In line X,Your ans is wrong:expected = X,found = Y
C++实现
```cpp
#include <bits/stdc++.h>
using namespace std;
stack < int > pru;
int n, m, x, y, in[100001], out[100001], t, f, ff[5001][5001];
int main(){
scanf("%d %d", &n, &m);
for(register int i = 1; i <= m; ++i) {
scanf("%d %d", &x, &y);
++in[y];
++out[x];
ff[x][out[x]] = y;//存出度的节点编号
}
for(register int i = 1; i <= n; ++i) {
if(in[i] == 0) {
pru.push(i);
++t;
}
}
if(t > 1) {
f = 1;//存起来
}
t = 0;//置零
while(!pru.empty()) {
int u = pru.top();//取出
pru.pop();
printf("%d\n", u);//输出
t = 0;//置零
for(register int i = 1; i <= out[u]; ++i) {
int k = ff[u][i];//连出来的这个点
--in[k];//消除
if(in[k] == 0) {
pru.push(k);
++t;//相同级别 + 1
}
}
if(t > 1){
f = 1;
}
}
printf("%d", f);//别忘了输出这个
return 0;
}

## 后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容