传递闭包floyed

POJ3660 Cow Contest

题意:N个选手,如果A比B强,B比C强,则A必比C强。告知若干个强弱关系,问有多少人的排名可以确定
思路:设x个人比你强,y个人比你若,则当x+y==n-1时,才可以确定你的排名

#include<iostream>
#include<cstdio> 
using namespace std;
const int inf=1e9;
const int maxn=1e3+5;
int mp[maxn][maxn],ans,n,m,x,y;
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
        if(i==j)mp[i][j]=0;
	    else mp[i][j]=inf;
    for(int i=1;i<=m;i++){
    	scanf("%d%d",&x,&y);
    	mp[x][y]=1;
	}
	for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	for(int k=1;k<=n;k++){
		if(mp[j][i]+mp[i][k]<mp[j][k]){
			mp[j][k]=1;
		}
	}
	for(int i=1;i<=n;i++){
		int sum=0;
		for(int j=1;j<=n;j++){
			if(i==j)continue;
			if(mp[i][j]!=inf)sum++;
			else if(mp[j][i]!=inf)sum++;
		}
		if(sum==n-1)ans++;
	}
	printf("%d\n",ans);
}
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
传递闭包是一个用于描述关系的概念,其中对于集合中的任意两个元素,如果存在一条路径可以从一个元素到达另一个元素,则称该关系具有传递性。在计算机科学中,传递闭包常常用于优化算法和数据结构。 Bitset是C++标准库中的一个类,它可以被用来表示一个固定大小的位集合。Bitset提供了一组操作,如设置某一位的值、获取某一位的值、进行位运算等。在优化传递闭包时,可以使用bitset来表示关系的传递闭包。 具体的优化方法如下: 1. 初始化bitset:首先,创建一个大小为n的bitset,其中n是关系中元素的数量。将所有的位初始化为0。 2. 构建初始关系:根据关系的定义,将bitset中与初始关系有关的位设置为1。例如,如果存在一个关系R中的元素i到元素j的边,则将bitset中的第(i*n+j)位设置为1。 3. 计算传递闭包:使用Floyd-Warshall算法计算传递闭包。通过遍历所有的中间节点k和所有的节点i和j,如果bitset中的第(i*n+k)位和第(k*n+j)位都为1,则将bitset中的第(i*n+j)位设置为1。 4. 查询传递闭包:在计算完传递闭包后,可以使用bitset的位操作来快速查询关系的传递性。例如,可以通过检查bitset中的第(i*n+j)位是否为1来判断元素i是否可以到达元素j。 使用bitset来优化传递闭包可以有效地减少内存消耗和提高运算效率,尤其在处理大规模数据时尤为明显。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值