体育记者C++(前向星)
题目描述
小A是一个体育报社的记者,接受到一个艰难的任务:有N支足球队参加足球比赛,现在给你一些比赛的结果,需要你给出各支球队的排名,从1到N。
以下是给你的一些信息:
(1)没有平局;
(2)不同的球队排名不能相同;
(3)对于所有满足l≤a<b≤n,第a名的球队一定可以打败第b名的球队。
给你部分比赛结果,要求给出排名,并且判断是否存在另一种排名方法满足给你的比赛结果
输入
第一行输入N(1≤N≤5000),表示球队的数量,编号为l到N。第二行输入M(1≤M≤100,000),表示给出的比赛场数。接下来M行,每行两个整数X_i,Y_i,表示X_i能打败Y_i。
输出
输出包含N+1行,前N行描述球队的排名,第i个数表示第i名的球队(有多种排名时,输出字典序小的),第N+1行包含一个整数,如果为0表示不存在其他的排名方法,如果为1表示还有其他的排名方法。
样例输入 复制
3
2
2 1
2 3
样例输出 复制
2
1
3
1
提示
【数据范围】
30%的数据满足:l≤N≤7,1≤M≤15
60%的数据满足:l≤N≤100,1≤M≤2000
100%的数据满足:l≤N≤5000,1≤M≤100000
程序
#include <bits/stdc++.h>using namespace std;const int maxn=100005;int m,n,a,b,c,p,cnt,head[maxn],rd[maxn],ans[maxn];bool k;priority_queue<int>q;struct edge{ int to,next;}e[500002];void bu(int x,int y){ e[++cnt].next=head[x]; e[cnt].to=y; head[x]=cnt; rd[y]++;}int main(){ k=false; cin>>n>>m; for(int i=1;i<=m;i++) { cin>>a>>b; bu(a,b); } p=0; for(int i=1;i<=n;i++) if(rd[i]==0) { q.push(-i); p++; } if(p>1) k=1; while(!q.empty()) { c=-q.top(); ans[++ans[0]]=c; q.pop(); p=0; for(int i=head[c];i;i=e[i].next) { rd[e[i].to]--; if(rd[e[i].to]==0) { q.push(-e[i].to); p++; } } if(p>1) k=1; } for(int i=1;i<=ans[0];i++) cout<<ans[i]<<"\n"; cout<<k; return 0;}
