欢迎光临散文网 会员登陆 & 注册

体育记者C++(前向星)

2023-07-13 20:32 作者:喵雕沙  | 我要投稿

题目描述

小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;
}

体育记者C++(前向星)的评论 (共 条)

分享到微博请遵守国家法律