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. [linux]搭建nfs

    环境 说明 IP 系统版本 服务端 192.168.137.7 centos 7 客户端 192.168.137.8 centos 7 步骤 配置服务端 安装 nfs 服务 yum install - ...

  2. Docker从入门到部署项目

    Docker概念 Docker是一个开源的应用容器引擎,它是基于Go语言并遵从Apache2.0协议开源.Docker可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流 ...

  3. [ABC126E] 1 or 2

    2023-01-07 题目 题目传送门 翻译 翻译 难度&重要性(1~10):2 题目来源 AtCoder 题目算法 并查集 解题思路 因为每张卡片上的数字只能是 \(1\) 或者 \(2\) ...

  4. [远程Call]32位远程多参数带返回调用

    [远程Call]32位远程多参数带返回调用 引子 在Windows上可以使用CreateRemoteThread实现远程Call,但是有不带返回值且只能传递一个参数的限制. 解决思路 将多个参数利用V ...

  5. 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(3)--自定义用户控件

    在我们创建界面元素的时候,不管在Vue3+ElementPlus的前端上,还是Winform桌面端上,都是会利用自定义用户控件来快速重用一些自定义的界面内容,对自定义用户控件的封装处理,也是我们开发W ...

  6. 58同城二手车数据爬虫——数字加密解码(Python原创)

    一.基础首页爬取 def crawler(): # 设置cookie cookie = '''cisession=19dfd70a27ec0e t_f805f7762a9a237a0deac37015 ...

  7. std::for_each易忽略点

    以下代码为修改vector内部的每一个元素,使其每个元素大小变为原来的平方. std::vector v1{1, 2, 4, 2}; std::for_each(begin(v1), end(v1), ...

  8. 若依(ruoyi)开源系统-多数据源问题踩坑实录

    内容概要 上一节内容   介绍了用开源系统若依(ruoyi)搭建页面的过程.在实际项目中,经常遇到多数据源后者主从库的情况.本节记录若依多数据源配置过程中遇到的问题排查过程. 背景描述 1.上一节在r ...

  9. 2020 5 17 codeforces

    cf还没结束,就开始写总结了.cf确实是个好东西,能够直接暴露出弱点和增加刷题量.以后还是要多打打的.这次我发现自己的码力还是不行.一个二分都要调好久.唉T1sb题,就是入门用的.题目看不懂...写了 ...

  10. 程序是如何在计算机上被执行的?(下篇:cpu工作原理)

    本文接上文程序是如何在计算机上被执行的?(上篇:软件部分),主要内容是机器语言如何在计算机硬件上运行,关于逻辑门,加法器,布尔运算,亦即,cpu的工作原理. 1.逻辑门 以下图片是<三体> ...