题目描述
你是一个体育报社的记者,你接受到一个艰难的任务:有 N 支足球队参加足球比赛,现在给你一些比赛的结果,需要你给出各支球队的排名,从 1 到 N。
以下是给你的一些信息:
- 没有平局;
- 不同的球队排名不能相同;
- 对于所有满足 1≤a<b≤N,第 a 名的球队一定可以打败第 b 名的球队。
给你部分比赛结果,要求给出排名,并且判断是否存在另一种排名方法满足给你的比赛结果。
输入格式
第一行输入 N(1≤N≤5000),表示球队的数量,编号为 1 到 N。
第二行输入 M(1≤M≤100,000),表示给出的比赛场数。
接下来 M 行,每行两个整数 Xi,Yi,表示 Xi 能打败 Yi。
输出格式
输出包含 N+1 行,前 N 行描述球队的排名,第 i 个数表示第 i 名的球队,第 N+1 行包含一个整数,如果为 0 表示不存在其他的排名方法,如果为 1 表示还有其他的排名方法。
输入输出样例
输入 #1复制
3 2 2 1 2 3输出 #1复制
2 1 3 1说明/提示
【数据范围】
30% 的数据满足:1≤N≤7,1≤M≤15
60%的数据满足:1≤N≤100,1≤M≤2000
100% 的数据满足:1≤N≤5000,1≤M≤100000
本题已加入spj,如果输出的最后一行错误将会提示
Your decide is wrong!
如果存在多种排名情况,排名错误将会提示
Wrong ranks!
如果情况固定且您的答案错误将会提示
In line X,Your ans is wrong:expected = X,found = Y
代码:郁闷的记者郁闷的我
#include <bits/stdc++.h>
using namespace std;
int n,m;
int in[1000010];
int cnt=1;//记录排名到第几名
int sn[1000010];//记录每个队伍的名次
int d,f;//判断是否是唯一情况
vector<int> e[1000010];
void topsort(){//模板 改动
queue<int> q;
for(int i = 1;i<=n;i++){
if(in[i]==0){
d++;
q.push(i);
sn[i]=cnt++;
}
}
if(d>1) f=1;//如果d>1说明每一次选择加进来了不止一个数字,即不止一种情况
while(q.size()){
int now=q.front();
q.pop();
d=0;
for(auto t:e[now]){
in[t]--;
if(in[t]==0){
d++;
sn[t]=cnt++;
q.push(t);
}
}
if(d>1) f=1;
}
for(int i = 1;i<=n;i++){//!!!输出排名对应的队伍!!!
for(int j = 1;j<=n;j++){
if(sn[j]==i) printf("%d\n",j);
}
}
if(f) printf("1");
else printf("0");
}
int main(){
scanf("%d%d",&n,&m);
for(int i = 1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
e[x].push_back(y);
in[y]++;
}
topsort();
return 0;
}
//碎了,样例过了但交上去全WA,看了好久没看出来问题[die]
//犯了愚蠢的输出错误,我输出的是每行队伍对应的排名,应该输出的是每行排名对应的队伍[捂脸]