标签:pac 告诉 闭包 col using 包含 一个 osi bitset
<题目链接>
题目大意:
#include <bits/stdc++.h> using namespace std; const int N=1005; bitset<N> b[N]; int n,ncase=0; double ans; void floyed(){ //floyed传递闭包 ans=0.0; for(int j=0; j<n; j++)//对于每个房间j,枚举i,若i可以到达j,则i可以到达j可以到达的所有房间,即传递闭包。 for(int i=0; i<n; i++) if(b[i][j])b[i]|=b[j]; for(int j=0; j<n; j++){ //得到每个以j为起点的闭包的节点数量 int cnt=0; for(int i=0; i<n; i++) if(b[i][j])cnt++;//对于j,看有多少个i可以直接或间接到达,最终该房间使用炸弹的期望为1.0/cnt,也就是平均要使用1.0/cnt个才能到达i; ans=ans+(1.0/cnt); } printf("Case #%d: %.5lf\n",++ncase,ans); } int main(){ int T;scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=0; i<n; i++){ b[i].reset(); b[i][i]=1;//一定可以到达自己所在房间。 } for(int i=0; i<n; i++){ int num;scanf("%d",&num); for(int j=0; j<num; j++){ int to;scanf("%d",&to); b[i][to-1]=1;//从房间i可以到达的房间。 } } floyed(); } }
HDU 5036 Explosion (传递闭包+bitset优化)
标签:pac 告诉 闭包 col using 包含 一个 osi bitset
原文地址:https://www.cnblogs.com/00isok/p/10486736.html