bzoj 3534 重建
2015-11-16 10:39
239 查看
矩阵树定理中邻接矩阵可以理解为那条边存在的概率是1,那么这道题邻接矩阵只要是概率就行了。然后再乱搞一下就行了没有搞明白相对误差和绝对误差……省选的时候说过多少遍?
#include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> #define md #define ll long long #define inf (int) 1e9 #define eps 1e-10 #define N 55 using namespace std; double a ; double ans=1; void outit() { for (int i=1;i<=3;i++) { for (int j=1;j<=3;j++) printf("%.2lf ",a[i][j]); printf("\n"); } } void solve(int n) { //outit(); int f=1; for (int i=1;i<=n;i++) { int k=i; double mx=fabs(a[i][i]); for (int j=i+1;j<=n;j++) if (fabs(a[j][i])>mx) {mx=fabs(a[j][i]); k=j; } if (k!=i) { f=-f; for (int j=i;j<=n;j++) swap(a[i][j],a[k][j]); } for (int j=i+1;j<=n;j++) { double p=a[j][i]/a[i][i]; for (int k=i;k<=n;k++) a[j][k]-=p*a[i][k]; } if (fabs(a[i][i])<eps) { printf("0.000000\n"); exit(0);} } //outit(); for (int i=1;i<=n;i++) ans=ans*a[i][i]; ans=ans*f; printf("%.10lf\n",fabs(ans)); } int main() { //freopen("p7.in","r",stdin); freopen("p.out","w",stdout); int n; scanf("%d",&n); for (int i=1;i<=n;i++) { double sum=0; for (int j=1;j<=n;j++) { scanf("%lf",&a[i][j]); if (a[i][j]>1-eps) a[i][j]-=eps; if (i<j) ans=ans*(1-a[i][j]); if (i!=j) { a[i][j]=-(a[i][j])/(1-a[i][j]); sum+=a[i][j]; } } a[i][i]-=sum; } solve(n-1); return 0; } /* 3 0 0 1 0 0 0 1 0 0 */
相关文章推荐
- bzoj 4017 小Q的无敌异或
- bzoj 1002 轮状病毒
- bzoj 3288 矩阵
- bzoj 4031 小z的房间
- bzoj 4004 装备购买
- 容斥原理
- 主席树&树状数组套主席树
- bzoj 3589 动态树
- bzoj 3622 已经没有什么好害怕的了
- 几种线程池的实现算法分析【转载】
- OC中的特有语法
- 搭建jenkins环境(linux操作系统)
- Codeforces Round #331 (Div. 2)
- java代码封装
- 客户端登录也危险?--防范SQL注入漏洞
- ft5x06获取PROJECT_ID/ FW_VER /VENDOR_ID/ glass_vendor
- 看了zzb的安排
- bzoj 3198 spring
- bzoj 1042 硬币购物
- bzoj 2563 阿狸和桃子的游戏