bzoj3534(矩陣樹定理)
阿新 • • 發佈:2018-11-21
這個題目還是有點意思。。
莽了一發過不去樣例發現是因為沒有考慮非樹邊的概率,所以實際要求的應該是
然後要轉化一下成為T上點的乘積,就變成了
然後用pi/(1-pi)構造基爾霍夫矩陣就可以了。。
然而有pi==1感覺沒辦法解決啊qaq網友說直接減個eps就好了(窩怎麼這麼智障
/* * ┏┓ ┏┓ * ┏┛┗━━━━━━━┛┗━━━┓ * ┃ ┃ * ┃ ━ ┃ * ┃ > < ┃ * ┃ ┃ * ┃... ⌒ ... ┃ * ┃ ┃ * ┗━┓ ┏━┛ * ┃ ┃ Code is far away from bug with the animal protecting * ┃ ┃ 神獸保佑,程式碼無bug * ┃ ┃ * ┃ ┃ * ┃ ┃ * ┃ ┃ * ┃ ┗━━━┓ * ┃ ┣┓ * ┃ ┏┛ * ┗┓┓┏━┳┓┏┛ * ┃┫┫ ┃┫┫ * ┗┻┛ ┗┻┛ */ #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include<cmath> #include<map> #include<stack> #include<set> #include<bitset> #define inc(i,l,r) for(int i=l;i<=r;i++) #define dec(i,l,r) for(int i=l;i>=r;i--) #define link(x) for(edge *j=h[x];j;j=j->next) #define mem(a) memset(a,0,sizeof(a)) #define ll long long #define eps 1e-8 #define succ(x) (1LL<<(x)) #define lowbit(x) (x&(-x)) #define sqr(x) ((x)*(x)) #define mid (x+y>>1) #define NM 55 #define nm 100005 #define pi 3.1415926535897931 using namespace std; const int inf=1e9; int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch))x=x*10+ch-'0',ch=getchar(); return f*x; } int n; double a[NM][NM],t; double det(){ inc(i,1,n){ bool f=true; if(abs(a[i][i])<eps){ f=false; inc(j,i+1,n)if(abs(a[j][i])>eps){ inc(k,i,n)swap(a[i][k],a[j][k]); f++; break; } } if(!f)return 0; inc(j,i+1,n){ double t=a[j][i]/a[i][i]; inc(k,i,n)a[j][k]-=t*a[i][k]; } } double ans=1; inc(i,1,n)ans*=a[i][i]; //inc(i,1,n){inc(j,1,n)printf("%.2lf ",a[i][j]);putchar('\n');} return ans; } int main(){ n=read();t=1; inc(i,1,n)inc(j,1,n)scanf("%lf",&a[i][j]),a[i][j]-=eps; inc(i,1,n)inc(j,i+1,n)t*=1-a[i][j]; inc(i,1,n)inc(j,1,n)if(i!=j)a[i][j]=a[i][j]/(1-a[i][j]); inc(i,1,n)inc(j,1,n)if(i!=j)a[i][i]-=a[i][j]; n--; return 0*printf("%.9lf\n",fabs(det()*t)); }
3534: [Sdoi2014]重建
Time Limit: 10 Sec Memory Limit: 512 MBSec Special Judge
Submit: 1400 Solved: 688
[Submit][Status][Discuss]
Description
T國有N個城市,用若干雙向道路連線。一對城市之間至多存在一條道路。
在一次洪水之後,一些道路受損無法通行。雖然已經有人開始調查道路的損毀情況,但直到現在幾乎沒有訊息傳回。
辛運的是,此前T國政府調查過每條道路的強度,現在他們希望只利用這些資訊估計災情。具體地,給定每條道路在洪水後仍能通行的概率,請計算仍能通行的道路恰有N-1條,且能聯通所有城市的概率。
Input
輸入的第一行包含整數N。
接下來N行,每行N個實數,第i+l行,列的數G[i][j]表示城市i與j之
間仍有道路聯通的概率。
輸入保證G[i][j]=G[j][i],且G[i][j]=0;G[i][j]至多包含兩位小數。
Output
輸出一個任意位數的實數表示答案。
你的答案與標準答案相對誤差不超過10^(-4)即視為正確。
Sample Input
3
0 0.5 0.5
0.5 0 0.5
0.5 0.5 0
Sample Output
0.375
HINT
1 < N < =50
資料保證答案非零時,答案不小於10^-4