Acwing4244.牛的比赛

题目部分

N 头奶牛,编号 1∼N,一起参加比赛。

奶牛的战斗力两两不同。

这些奶牛之间已经进行了 M轮两两对决。

在对决中,战斗力高的奶牛一定会战胜战斗力低的奶牛。

请问,通过上述 M轮对决的结果,可以确定多少头奶牛的具体战斗力排名。

输入格式

第一行包含两个整数 N,M。

接下来 M行,每行包含两个整数 a,b,表示奶牛 a 和奶牛 b 之间进行了对决,并且奶牛 a 战胜了奶牛 b。

输出格式

输出可以确定具体战斗力排名的奶牛数量。

数据范围

1≤N≤100,

1≤M≤4500,

数据保证合法。

输入样例:

5 5
4 3
4 2
3 2
1 2
2 5

输出样例:

2

样例解释

2号奶牛输给了 1,3,4 号奶牛,战胜了 5 号奶牛,可以确定它的战斗力排名为 4。

5号奶牛输给了排在第 4 的 2 号奶牛,所以它的战斗力排名为 5。

其它奶牛不确定。

解法

首先这道题,虽然大佬们说是板子题,但是对我图论新手来说,这题还是相当有意思的!学到了很多!

错误解法

首先原先的我,是有点懵的,在看到这道题时,我们能够通过floyd得出这道题?我是怎么也想不出

我只能分析出某头牛的排名能确定下来,是因为它间接和其余的牛battle过

然后看了下大佬的题解(仅文字部分):

这是link,才做出了错误解法

还原下,我做出错误解法的思路哈:

我们可以把这些两头牛有没有间接比较过,转换为每个牛都是对应图中的节点,然后两点中可达,则为间接比较过

由此我通过转换关系把题目图化了,但是我不是添加单条有向边,而是添加了双向边

赋值为1的,代表着战胜

赋值为0的,代表着战败

想得很美好,由于对floyd算法运行流程不熟悉,导致误以为只要判断通过战败可达其余点或者战胜可达其余点即可,可是在floyd过程中,却是我们可以先通过战败边到另一个点,然后再由这个点选择战胜边接着刷新dist数组,导致算法有问题

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; /**
* @author:天才玩家M
* @date:2023/11/29 16:05
* @description:TODO
*/
public class Main {
static int n,m;
static int N=110;
static int INF=Integer.MAX_VALUE/4;
static int [][]dist=new int[N][N];
public static void floyd(){
for (int k = 1; k <=n; k++) {
for (int i = 1; i <=n; i++) {
for (int j = 1; j <=n ; j++) {
dist[i][j]=Math.min(dist[i][j],dist[i][k]+dist[k][j]);
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
String[] s1 = s.split(" ");
n = Integer.parseInt(s1[0]);
m = Integer.parseInt(s1[1]);
for (int i = 0; i <= n; i++) {
for (int j = 0; j <=n; j++) {
if(i==j){
dist[i][j]=1;
}else{
dist[i][j]=INF;
}
} }
for (int i = 0; i < m; i++) {
s = br.readLine();s1 = s.split(" ");
int a=Integer.parseInt(s1[0]);
int b=Integer.parseInt(s1[1]);
dist[a][b]=1;//代表可达且胜利
//dist[b][a]=0;不能多出这一条,这只能是a->b单向的
//不对上面的说法是错的,我们可以设置可达不过要与胜利有所区别
dist[b][a]=0;//代表失败的可达,
//想法很好,可是你有没有想过我们失败的点可以沿着失败的路线上去到达某个成功的点然后由成功的点再蔓延下去呢?
//这种情况就违背了我们最初的意愿了,只让他们沿着成功之路或者失败之路而上,且我们只统计成功之路以及失败之路
//2:可是这种情况下,如果夹杂成成功与失败,那我们又不会去统计!!!
//那为什么正确答案为6而我们的为2呢?
//解决了,答案浮出水面了,就是因为不去统计,假如1已经确定是倒数第一,而你唯一赢他的你又不算,那这不就少了吗?
}
floyd();
int res=0;
for (int i = 1; i <=n; i++) {
int count1=0;
int count=0;
for (int j = 1; j <=n; j++) {
if(dist[i][j]==0){
count1++;
}
else if(dist[i][j]!=INF){
count++;
}
}
if(count==n||count1==n){
res++;
}
}
System.out.println(res);
}
}

正确做法

大佬优雅地解决我一直困扰的战败与战胜,通过仅赋值单向边,而之后同时判断if(dist[i][j]<=INF/2||dist[j][i]<=INF/2),来确定这个对手是否交战过,并且由于仅赋值了战胜那一条,目前点要么战胜要么战败,而且看得比我的透彻,其实做出错误做法时,我就已经被要么战胜要么战败给迷惑了,

可是实际情况下是只要战过,无论成败即知排名(挺好想的,只要交手过,赢你的在前,输你的在后,你一定可以找到个位置).

至于INF/2是由于边比较多设定的,其他的也行

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; /**
* @author:天才玩家M
* @date:2023/11/29 20:38
* @description:TODO
*/
public class Main1 {
static int n,m;
static int N=110;
static int INF=Integer.MAX_VALUE/2;
static int [][]dist=new int[N][N];
public static void floyd(){
for (int k = 1; k <=n; k++) {
for (int i = 1; i <=n; i++) {
for (int j = 1; j <=n ; j++) {
dist[i][j]=Math.min(dist[i][j],dist[i][k]+dist[k][j]);
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
String[] s1 = s.split(" ");
n = Integer.parseInt(s1[0]);
m = Integer.parseInt(s1[1]);
for (int i = 0; i <= n; i++) {
for (int j = 0; j <=n; j++) {
if(i==j){
dist[i][j]=1;
}else{
dist[i][j]=INF;
}
} }
for (int i = 0; i < m; i++) {
s = br.readLine();s1 = s.split(" ");
int a=Integer.parseInt(s1[0]);
int b=Integer.parseInt(s1[1]);
dist[a][b]=1;
}
floyd();
int res=0;
for (int i = 1; i <=n; i++) {
int count=0;
for (int j = 1; j <=n; j++) {
if(dist[i][j]<=INF/2||dist[j][i]<=INF/2){
count++;
}
}
if(count==n){
res++;
}
}
System.out.println(res);
}
}

Acwing4244牛的比赛的更多相关文章

  1. 牛客比赛-假的字符串-Trie+拓扑

    链接:https://www.nowcoder.com/acm/contest/59/B来源:牛客网 题目描述 给定n个字符串,互不相等,你可以任意指定字符之间的大小关系(即重定义字典序),求有多少个 ...

  2. 牛客比赛-状压dp

    链接:https://www.nowcoder.com/acm/contest/74/F来源:牛客网 德玛西亚是一个实力雄厚.奉公守法的国家,有着功勋卓著的光荣军史. 这里非常重视正义.荣耀.职责的意 ...

  3. 牛客比赛-Wannafly9-A/B/C

    A-链接:https://www.nowcoder.com/acm/contest/71/A来源:牛客网 给定n个正整数,请找出其中有多少个数x满足:在这n个数中存在数y=kx,其中k为大于1的整数 ...

  4. 洛谷 P2965 [USACO09NOV]农活比赛The Grand Farm-off

    P2965 [USACO09NOV]农活比赛The Grand Farm-off 题目描述 Farmer John owns 3*N (1 <= N <= 500,000) cows su ...

  5. bzoj1612 Usaco08 Jan 牛大赛

    水题模拟 建一个图,每两个牛进行比赛就连一条边,然后两遍dfs求出比他弱和比他强的牛,最后如果相加数量等于n,说明他能与全部的牛进行比较,排名确定. #include<bits/stdc++.h ...

  6. 给定n,求1/x + 1/y = 1/n (x<=y)的解数~hdu-1299~(分解素因子详解)

    链接:https://www.nowcoder.com/acm/contest/90/F来源:牛客网 题目描述 给定n,求1/x + 1/y = 1/n (x<=y)的解数.(x.y.n均为正整 ...

  7. [总结] NOIP 前的考试记录

    sb博主又犯sb错误了! 他觉得以往模拟赛因为犯sb错误扔的分足足有1k分了! 于是他想记录一下自己犯的sb错误看看自己到底有多sb! 嗯就从今天开始吧 2018.9.28 1. 二分边界写错.骚什么 ...

  8. Test传送门(更新中)

    一.Codeforces传送门: Avito Code Challenge 2018 题解传送门 Codeforces Round #485 (Div. 2)     题解传送门 二.hihocode ...

  9. floyd骚操作——传递闭包

    传递闭包的含义指通过传递性推导出尽量多的元素之间的关系,而传递闭包一般都是采用floyd算法. 下面用两道题来实现传递闭包: Problem 1(POJ3660): 题目链接:http://poj.o ...

  10. 日记o3o

    12.17 段考超级烂,连sts都没考过,但是今晚来机房,nj发邮件的时候也给我发了,看来是可以继续学竞赛啦,很快心,也挺不开心的,毕竟以后想要跟上文化课就要很努力了,有能力但是得去花时间啊,寒假又要 ...

随机推荐

  1. 【go笔记】从安装到helloworld

    前言 Go语言也称Golang,google出品,特点在于编程简便的同时并发性能不俗. 环境准备: Go语言版本:1.17.2.安装包下载链接:https://studygolang.com/dl l ...

  2. 定义一个类,在实例化的时候,抛出NameError异常

    代码1:class cla: def __init__(self): #raise NameError # 抛出异常 print(r) cla() 运行截图:

  3. 图加速数据湖分析-GeaFlow和Apache Hudi集成

    表模型现状与问题 关系模型自1970年由埃德加·科德提出来以后被广泛应用于数据库和数仓等数据处理系统的数据建模.关系模型以表作为基本的数据结构来定义数据模型,表为二维数据结构,本身缺乏关系的表达能力, ...

  4. 让C#调用vue组件里的方法

    前言:web页面开发时采用的是vue开发的,后台语言是C# 需求:后台需要通过浏览器调用vue组件的方法 c# 可以调用xxx.html 中的script引用的js中定义的方法是可以调用的, 之前c# ...

  5. 让 GPT-4 来修复 Golang “数据竞争”问题(续) - 每天5分钟玩转 GPT 编程系列(7)

    目录 1. 我以为 2. 阴魂不散的"数据竞争"问题 3. 老规矩,关门放 GPT-4 3.1 复现问题 3.2 让 GPT-4 写一个单元测试 3.3 修复 Wait() 中的逻 ...

  6. 从原理聊 JVM(五):JVM 的编译过程和优化手段

    一.前端编译 前端编译就是将Java源码文件编译成Class文件的过程,编译过程分为4步: 1 准备 初始化插入式注解处理器(Annotation Processing Tool). 2 解析与填充符 ...

  7. RocketMQ 系列(二) 环境搭建

    RocketMQ 系列(二) 环境搭建 上一个章节对于 RocketMQ 作了一些概念上的介绍,如果你对于 RocketMQ 没有概念,不妨先看RocketMQ系列(一) 基本介绍. 这个章节主要介绍 ...

  8. 如何get一个终身免费续期的定制数字人?

    想拥有一个"数字分身" 吗?给你一个终身免费续期的特权. 定制周期长?训练.运营成本高?成片效果生硬?无法应用于实际场景? 随着AIGC技术的快速发展,虚拟数字人的生成效率不断提高 ...

  9. Dami 本地过程调用框架(主打解耦),v0.24 发布

    Dami,专为本地多模块之间通讯解耦而设计(尤其是未知模块.隔离模块.领域模块).零依赖,特适合 DDD. 特点 结合 Bus 与 RPC 的概念,可作事件分发,可作接口调用,可作异步响应. 支持事务 ...

  10. 3 分钟把高质量 AI 知识库 FastGPT 装进企业微信

    FastGPT V4 已经上线,直接冲上 GitHub Trending. 如果你还不知道 FastGPT 是什么,可以先去看看作者的介绍 使用 FastGPT 构建高质量 AI 知识库 非常多的企业 ...