hdu5036 Explosion 传递闭包

大哲哥的讲课内容

根据期望的线性性,得到总期望为各个点被轰的概率(不会证,好像是这样吧)

传递闭包解决出每个点的祖先(能到达它的点)就能算概率了

bitset能贡献1/w的复杂度,而且导致Floyd只剩下两个for了(一点都不像经典Floyd)

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int T,n,m,t;
 4 bitset<1001> a[1001];
 5 int main()
 6 {
 7     scanf("%d",&T);
 8     for(int cas=1;cas<=T;cas++)
 9     {
10         scanf("%d",&n);
11         for(int i=1;i<=n;i++)
12             a[i].reset(),a[i][i]=1;
13         for(int i=1;i<=n;i++)
14         {
15             scanf("%d",&m);
16             for(int j=1;j<=m;j++)
17                 scanf("%d",&t),a[t][i]=1;
18         }
19         for(int i=1;i<=n;i++)
20             for(int j=1;j<=n;j++)
21                 if(a[j][i])
22                     a[j]|=a[i];
23         double ans=0;
24         for(int i=1;i<=n;i++)
25             ans+=1.0/a[i].count();
26         printf("Case #%d: %.5f\n",cas,ans);
27     }
28     return 0;
29 }
时间: 2024-10-11 02:30:13

hdu5036 Explosion 传递闭包的相关文章

HDU 5036 Explosion (传递闭包+bitset优化)

<题目链接> 题目大意: 一个人要打开或者用炸弹砸开所有的门,每个门后面有一些钥匙,一个钥匙对应一个门,告诉每个门里面有哪些门的钥匙.如果要打开所有的门,问需要用的炸弹数量为多少. 解题分析:因为许多门和他们之后的钥匙可能形成闭包的关系,所以,对于所有的闭包而言,只需要炸毁其中的一个门,就可以用其后面的钥匙打开闭包中至少一扇另外的门,一次类推.所以,假设闭包中包含$num$扇门,用炸弹打开闭包中任意一扇门的概率就为:$1/num$(因为炸毁每个闭包的概率为1,即每个闭包必然需要一枚炸弹).所有

HDU5036 Explosion(期望&amp;&amp;bitset)

#include <iostream> #include <cstring> #include <string> #include <vector> #include <cstdio> #include <algorithm> #include <cmath> #include <bitset> using namespace std; #define maxn 1005 bitset<1100>

HDU5036 Explosion(期望 bitset)

题意 题目链接 Sol 和cf上的一道题几乎一摸一样 首先根据期望的线性性,可以转化为求每个点的期望打开次数,又因为每个点最多会被打开一次,只要算每个点被打开的概率就行了 设\(anc[i]\)表示\(i\)的反图中能到达的点集大小,答案等于\(\sum_{i = 1}^n \frac{1}{anc[i]}\)(也就是要保证是第一个被选的) #include<bits/stdc++.h> using namespace std; const int MAXN = 1001; inline in

hdu 5036 Explosion (bitset优化的传递闭包求解概率)

Explosion Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 142    Accepted Submission(s): 25 Problem Description Everyone knows Matt enjoys playing games very much. Now, he is playing such a g

Bzoj 1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名 传递闭包,bitset

1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 323  Solved: 238[Submit][Status][Discuss] Description 农夫约翰有N(1≤N≤1000)头奶牛,每一头奶牛都有一个确定的独一无二的正整数产奶率.约翰想要让这些奶牛按产奶率从高到低排序.    约翰已经比较了M(1≤M≤10000)对奶牛的产奶率,但他发现,他还需要再做一

poj 1975 Median Weight Bead(传递闭包 Floyd)

链接:poj 1975 题意:n个珠子,给定它们之间的重量关系,按重量排序,求确定肯定不排在中间的珠子的个数 分析:因为n为奇数,中间为(n+1)/2,对于某个珠子,若有至少有(n+1)/2个珠子比它重或轻,则它肯定不排在中间 可以将能不能确定的权值初始化为0,能确定重量关系的权值设为1 #include<stdio.h> #include<string.h> int a[110][110]; int main() { int T,n,m,i,j,k,d,x,sum; scanf(

poj2594最小顶点覆盖+传递闭包

传递闭包最开始是在Floyd-Warshall算法里面出现的,当时这算法用的很少就被我忽视了.. 传递闭包是指如果i能到达k,并且k能到达j,那么i就能到达j Have you ever read any book about treasure exploration? Have you ever see any film about treasure exploration? Have you ever explored treasure? If you never have such exp

hdu 5036 Explosion(概率期望+bitset)

Problem Description Everyone knows Matt enjoys playing games very much. Now, he is playing such a game. There are N rooms, each with one door. There are some keys(could be none) in each room corresponding to some doors among these N doors. Every key

UVA 247 电话圈 (floyd传递闭包 + dfs输出连通分量)

题意:输出所有的环: 思路:数据比较小,用三层循环的floyd传递闭包(即两条路通为1,不通为0,如果在一个环中,环中的所有点能互相连通),输出路径用dfs,递归还没有出现过的点(vis),输出并递归该点与其他点能互达的点: 1 #include <cstdio> 2 #include <vector> 3 #include <string> 4 #include <cstring> 5 #include <iostream> 6 using n