Cow Contest( ps: 关于Floyd的小水题(*^▽^*) )

文章讲述了如何通过Floyd算法计算在一个竞赛中,知道某选手比其他选手强或逊的人数,以满足题目给出的“比他强的人数+比他逊的人数=n-1”的条件。作者给出了C++代码示例来实现这一过程。
摘要由CSDN通过智能技术生成

题目描述(简化版=非︿( ̄︶ ̄)︿原题)

就是说a->b就代表b太逊了比不过a,题中所谓的可以确定排名就是所有人都知道比他强或逊,也就是说比他强的人数+比他逊的人数=n-1(doge:有脑子就知道剩下一个人是他自己)

额额额额(⊙o⊙)…。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

这题就是这么简单,答案就是符合上述条件的人数(PS:万万没想到竟然有一题在解释题目描述是ttm就把大体思路说完了wc)

分析

既然如此那就话不多说了

所以结合上面的题目描述这题其实要我们做的就是求

知道比他强的人数+比他逊的人数=n-1人的总人数

所以说这题就跟Floyd扯上关系了???????????????????????????????????????????

这时候就要涉及到Floyd的基本应用了(ps:会的直接跳过)

Floyd的基本应用:

1.最短路计算

ps:板子

2.就是这里要用的(维护两点连通性)

继续分析

回归到正题 

那么这样我们就可以用板子2号(Floyd维护连通性)来解决这个问题了

用他来维护连通性

在维护之后就统计例如

d[x][y]就是x->y,x比y强

反之就是y比x强

所以现在直接上标程

标程

#include<cstdio>
#include<iostream>
#include<queue>
#include<string>
#include<cstring>
using namespace std;
const int N=5000;
int n,m;
int f[N][N];
int main(){
	cin>>n>>m;
	for (int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		f[u][v]=true;
	}
	for (int k=1;k<=n;k++){
		for (int i=1;i<=n;i++){
			for (int j=1;j<=n;j++){
				if (f[i][k]&&f[k][j]){
					f[i][j]=true;
				}
			} 
		}
	}
	int ans=0;
	for (int i=1;i<=n;i++){
		int cnt=0; 
		for (int j=1;j<=n;j++){
			if (f[i][j]) cnt++;
			if (f[j][i]) cnt++;
		}
		if (cnt==(n-1)){
			ans++;
		}
	}
	cout<<ans;
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值