2 3 1 2 1 3 1 1 3 0 0 0
Case #1: 1.00000 Case #2: 3.00000
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#include <bitset>
#define maxn 1005
#define MAXN 200005
#define INF 0x3f3f3f3f
#define mod 1000000007
#define eps 1e-6
const double pi=acos(-1.0);
typedef long long ll;
using namespace std;
int n,m;
double ans;
bitset<1005>edge[maxn];
void floyd()
{
int i,j,k;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(edge[j][i]) edge[j]|=edge[i];
}
}
int num;
ans=0;
for(i=1;i<=n;i++)
{
num=0;
for(j=1;j<=n;j++)
{
if(edge[j][i]) num++;
}
ans+=1.0/num;
}
}
int main()
{
int i,j,t,ca=0;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
edge[i].reset();
edge[i][i]=1;
}
int num,x;
for(i=1;i<=n;i++)
{
scanf("%d",&num);
for(j=1;j<=num;j++)
{
scanf("%d",&x);
edge[i][x]=1;
}
}
floyd();
printf("Case #%d: %.5f\n",++ca,ans);
}
return 0;
}hdu 5036 Explosion (bitset优化的传递闭包求解概率)
原文:http://blog.csdn.net/tobewhatyouwanttobe/article/details/39477819