BZOJ3270: 博物馆
生活随笔
收集整理的這篇文章主要介紹了
BZOJ3270: 博物馆
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
3270: 博物館
Time Limit: 30 Sec??Memory Limit: 128 MBSubmit: 269??Solved: 147
[Submit][Status][Discuss]
Description
有一天Petya和他的朋友Vasya在進行他們眾多旅行中的一次旅行,他們決定去參觀一座城堡博物館。這座博物館有著特別的樣式。它包含由m條走廊連接的n間房間,并且滿足可以從任何一間房間到任何一間別的房間。 兩個人在博物館里逛了一會兒后兩人決定分頭行動,去看各自感興趣的藝術品。他們約定在下午六點到一間房間會合。然而他們忘記了一件重要的事:他們并沒有選好在哪兒碰面。等時間到六點,他們開始在博物館里到處亂跑來找到對方(他們沒法給對方打電話因為電話漫游費是很貴的) 不過,盡管他們到處亂跑,但他們還沒有看完足夠的藝術品,因此他們每個人采取如下的行動方法:每一分鐘做決定往哪里走,有Pi 的概率在這分鐘內不去其他地方(即呆在房間不動),有1-Pi 的概率他會在相鄰的房間中等可能的選擇一間并沿著走廊過去。這里的i指的是當期所在房間的序號。在古代建造是一件花費非常大的事,因此每條走廊會連接兩個不同的房間,并且任意兩個房間至多被一條走廊連接。 兩個男孩同時行動。由于走廊很暗,兩人不可能在走廊碰面,不過他們可以從走廊的兩個方向通行。(此外,兩個男孩可以同時地穿過同一條走廊卻不會相遇)兩個男孩按照上述方法行動直到他們碰面為止。更進一步地說,當兩個人在某個時刻選擇前往同一間房間,那么他們就會在那個房間相遇。 兩個男孩現在分別處在a,b兩個房間,求兩人在每間房間相遇的概率。Input
第一行包含四個整數,n表示房間的個數;m表示走廊的數目;a,b (1?≤?a,?b?≤?n),表示兩個男孩的初始位置。 之后m行每行包含兩個整數,表示走廊所連接的兩個房間。 之后n行每行一個至多精確到小數點后四位的實數 表示待在每間房間的概率。 題目保證每個房間都可以由其他任何房間通過走廊走到。Output
輸出一行包含n個由空格分隔的數字,注意最后一個數字后也有空格,第i個數字代表兩個人在第i間房間碰面的概率(輸出保留6位小數) 注意最后一個數字后面也有一個空格Sample Input
2 1 1 21 2
0.5
0.5
Sample Output
0.500000 0.500000HINT
?
對于100%的數據有 n <= 20,n-1 <= m <= n(n-1)/2
?
Source
題解待更!
代碼:
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<cmath> #include<map> #include<vector> #define eps 1e-9 using namespace std; int n,m,tot,aa,bb; int d[405]; double a[405][405],p[405],f[405]; vector<int> e[405]; int id(int x,int y){return (x-1)*n+y; } void build(int x,int y) {a[id(x,y)][id(x,y)]--;for (unsigned int i=0; i<e[x].size(); i++)for (unsigned int j=0; j<e[y].size(); j++){int xx=e[x][i],yy=e[y][j];if (xx!=yy){if (xx==x && yy==y) a[id(x,y)][id(xx,yy)]+=1.0*p[x]*p[y];else if (xx==x) a[id(x,y)][id(xx,yy)]+=1.0*p[xx]*(1-p[yy])/d[yy];else if (yy==y) a[id(x,y)][id(xx,yy)]+=1.0*(1-p[xx])*p[yy]/d[xx];else a[id(x,y)][id(xx,yy)]+=1.0*(1-p[xx])*(1-p[yy])/d[xx]/d[yy];}} } void gauss() {double t; int to;for (int i=1; i<=tot; i++){t=0,to=0;for (int j=i; j<=tot; j++) if (fabs(a[j][i])>t) t=fabs(a[j][i]),to=j;if (to!=i) for (int j=1; j<=tot+1; j++) swap(a[to][j],a[i][j]);for (int j=i+1; j<=tot; j++) {if (fabs(a[j][i])<eps) continue;t=a[j][i]/a[i][i];for (int k=i; k<=tot+1; k++) a[j][k]-=t*a[i][k];}}for (int i=tot; i; i--){t=1.0*a[i][tot+1];for (int j=i+1; j<=tot; j++) t-=1.0*f[j]*a[i][j];f[i]=1.0*t/a[i][i];} } void init() {scanf("%d%d%d%d",&n,&m,&aa,&bb);tot=n*n;a[id(aa,bb)][tot+1]=-1;for (int i=1; i<=n; i++) e[i].push_back(i);for (int i=1; i<=m; i++){int u,v; scanf("%d%d",&u,&v); d[u]++; d[v]++;e[u].push_back(v); e[v].push_back(u);}for (int i=1; i<=n; i++) scanf("%lf",&p[i]);for (int i=1; i<=n; i++) for (int j=1; j<=n; j++) build(i,j); } int main() {init();gauss();for(int i=1;i<=n;i++){int t=id(i,i);printf("%.6lf",f[t]);if(i!=n)printf(" ");}return 0; } View Code?
轉載于:https://www.cnblogs.com/HQHQ/p/5793819.html
總結
以上是生活随笔為你收集整理的BZOJ3270: 博物馆的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【集合之HashMap】HashMap实
- 下一篇: jquery toggle方法使用出错?