洛谷P1960 郁闷的记者

郁闷的记者

题目描述

你是一个体育报社的记者,你接受到一个艰难的任务:有 N 支足球队参加足球比赛,现在给你一些比赛的结果,需要你给出各支球队的排名,从 1 到 N。

以下是给你的一些信息:

  1. 没有平局;
  2. 不同的球队排名不能相同;
  3. 对于所有满足 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]
//犯了愚蠢的输出错误,我输出的是每行队伍对应的排名,应该输出的是每行排名对应的队伍[捂脸] 
 
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值