BZOJ-2208-[Jsoi2010]连通数(bitset+floyd)

本文介绍了一种使用bitset优化Floyd算法求解图论中传递闭包的方法,以高效计算图的连通数。通过实例展示了如何利用bitset进行状态压缩,减少计算复杂度。

Description

Input

输入数据第一行是图顶点的数量,一个正整数N。 接下来N行,每行N个字符。第i行第j列的1表示顶点i到j有边,0则表示无边。

Output

输出一行一个整数,表示该图的连通数。

Sample Input

3
010
001
100

Sample Output

9

HINT

 

对于100%的数据,N不超过2000。

 

Source

 

题解

这道题刚看到就想到暴力,时限有20s,dfs可以A

但是dfs有些慢,我们想一些更优的算法

这道题就是让我们求传递闭包

所以我们可以用bitset来优化floyd

 1 #include<bits/stdc++.h>
 2 #define N 2005
 3 using namespace std;
 4 int n,x,ans;
 5 bitset<N>flag[N];
 6 char st[N];
 7 int main(){
 8     scanf("%d",&n);
 9     for (int i=1;i<=n;i++){
10         scanf("%s",st+1);
11         for (int j=1;j<=n;j++)
12             if (st[j]=='1'||i==j) flag[i][j]=true;
13     }
14     for (int j=1;j<=n;j++)
15         for (int i=1;i<=n;i++)
16             if (flag[i][j]) flag[i]|=flag[j];
17     for (int i=1;i<=n;i++)
18         ans+=flag[i].count();
19     printf("%d\n",ans);
20     return 0;
21 } 
View Code

 

转载于:https://www.cnblogs.com/zhuchenrui/p/7807885.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值