盒子之間的開啟關係 用圖的方式呈現 就是一片環
最終所有成功開啟 則每一顆環都成功開啟
所以求出每個環放k個點成功的概率
之後依次列舉每一顆環 及其內部選擇點數與在之前的環中選擇點數 再乘上對應概率
#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
typedef double db;
typedef long long ll;
inline int read()
while(ch>='0'&&ch<='9')
return x*f;
}void print(int x)
const int n=310;
int last[n],ecnt;
struct edgee[n];
inline void add(int u,int v)
;last[u]=ecnt;}
int fa[n];
int find(int x)
bool book[n];
int dep[n],size[n];
int len;
void dfs(int u)
dep[v]=dep[u]+1;
dfs(v);
size[u]+=size[v]; }}
int st[n],num[n],top;
db p[n][n],f[n],g[n],tmp[n][n];
int main()
else if(k==n)
top=0;
for(i=1;i<=n;++i)
if(find(i)==i)
st[++top]=i;
memset(book,0,sizeof(book));
for(i=1;i<=top;++i)
dep[st[i]]=1,dfs(st[i]),num[i]=len;
db now;
for(i=1;i<=top;++i)
memset(f,0,sizeof(f));
f[0]=1;
int s,t(0);
for(i=1;i<=top;++i)
printf("%.9lf\n",f[k]);
} return 0;
}
bzoj 5004 開鎖魔法II
給你n個點,每個點有且只有一條有向邊邊 你可以在上面選擇k個點,問你選到這k個點,沿著邊走,可以走完整個圖的概率是多少 很明顯,這個圖,最後會成為很多個不同的聯通塊 然後對於每乙個聯通塊,我們縮點之後,就會出現乙個樹,明顯地,樹的根是一定要選的 當然,樹的根有可能是乙個環 然而環裡面,你任意選擇乙個...
bzoj5004 開鎖魔法II dp
一日,崔克茜來到小馬鎮表演魔法。其中乙個節目是開鎖咒 舞台上有n 個盒子,每個盒子中有一把鑰匙,對於每個盒子而言有且僅有一把鑰匙能開啟它。初始時,崔克茜將會隨機地選擇k個盒子用魔法將它們開啟。崔克茜想知道最後 所有盒子都被開啟的概率,你能幫助她回答這個問題嗎?考慮鑰匙向盒子連邊,形成的圖一定為多個不...
bzoj3038(線段樹開根)
法1,因為最多不會開根6次,所以開根,直接搞 include include include include includeusing namespace std typedef long long ll inline ll read int n struct aa a 100025 4 void ...