題目:
設計乙個狀態表示兩個人分別在兩個點的狀態,帶個標號num[i][j];
據此得到狀態之間轉移的關係所構成的n元方程,高斯消元求解;
要注意起點的概率要+1,而且開始時兩個人在兩個點是有區分的,所以不能(a,b)和(b,a)都加;
用scanf會ce,所以改成了快讀和cin;
調了一天的才找到錯誤竟然是把d陣列和deg陣列弄混了!
**如下:
#include#include#include
#include
using
namespace
std;
int n,m,a,b,deg[25],ct,head[25
],cnt;
double d[630],a[630][630],p[25
];struct
n}edge[
625];
int num(int a,int b)
void
gauss()
}for(int i=cnt;i;i--)
}int
rd()
while(ch>='
0'&&ch<='
9')x=x*10+ch-'
0',ch=getchar();
return x*f;
}int
main()
for(int i=1;i<=n;i++)
//scanf("%lf",&p[i]);
cin>>p[i];
cnt=n*n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) if(i!=j)
a[num(edge[k].to,j)][x]+=(1.0-p[i])*p[j]/deg[i];
}for(int l=head[j];l;l=edge[l].next)a[num(i,edge[l].to)][x]+=(1.0-p[j])*p[i]/deg[j];
a[x][x]+=p[i]*p[j];
}for(int i=1;i<=cnt;i++)a[i][i]-=1.0
; a[num(a,b)][cnt+1]-=1.0;//
printf("a[%d]=%.2lf\n",num(a,b),a[num(a,b)][cnt+1]);
//a[num(b,a)][cnt+1]-=1.0;
//兩人有區分!
gauss();
for(int i=1;i<=n;i++)
printf(
"%.6lf
",d[num(i,i)]);
return0;
}
bzoj3270 博物館 期望 高斯消元
傳送門本題的點數很少,只有20個 考慮用二元組 s u,v 表示甲在 u 點,乙在 v 點的狀態 那麼可以用 f s 表示狀態 s 出現的概率 不同的 f 之間的轉移就是通過邊 轉移有4種情況 對於 s u,v 來說,有以下四種轉移 轉移一,甲乙都選擇不動,此時從 s 轉移到 s 概率為 p u p...
BZOJ 3270 博物館 概率 高斯消元
source實力透露做法。似乎有這麼個式子 f i,j pi p j f i,j 1 pi di p j f x,j 1 pj dj p i f i,y 1 pi di1 pjdj f x,y x adj i,y adjj 然後還有f a,b 1答案為f i,i 開n n個變數的方程組高斯消元?時間...
bzoj 3270 博物館 高斯消元 期望轉移
乍一看比較難想到這是一道高斯消元的題目,因為概率不好轉移,得不到方程。但是反過來想,用f a,b 來表示,兩個人分別在a房間和b房間的期望。那麼這個期望是可以通過與其相連的房間的期望累加得到的 這裡的f p,q 是列舉的出發點,而p1是其對應的概率 所以可以看出乙個多元帶有係數的方程,這才引出了高斯...