博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 2878: [Noi2012]迷失游乐园
阅读量:6564 次
发布时间:2019-06-24

本文共 3392 字,大约阅读时间需要 11 分钟。

1 #include
2 #include
3 #include
4 #define M 100005 5 #define ld long double 6 int head[M],next[10*M],u[10*M],l[10*M],n,m,cnt,du[M],v[M],root,now,fa[M],c[M]; 7 ld d[M],f[M],g[M],gg[M]; 8 using namespace std; 9 void jia(int a1,int a2,int a3) 10 { 11 cnt++; 12 u[cnt]=a2; 13 l[cnt]=a3; 14 next[cnt]=head[a1]; 15 head[a1]=cnt; 16 return; 17 } 18 void dfs1(int a1) 19 { 20 v[a1]=1; 21 for(int i=head[a1];i;i=next[i]) 22 if(!v[u[i]]&&!c[u[i]]) 23 { 24 dfs1(u[i]); 25 du[a1]++; 26 d[a1]+=f[u[i]]+(ld)l[i]; 27 } 28 if(du[a1]) 29 f[a1]=d[a1]/(ld)du[a1]; 30 if(a1!=root) 31 du[a1]++; 32 return; 33 } 34 void dfs2(int a1) 35 { 36 v[a1]=1; 37 for(int i=head[a1];i;i=next[i]) 38 if(!v[u[i]]&&!c[u[i]]) 39 { 40 int k=du[a1]-1; 41 if(!k) 42 k++; 43 d[u[i]]+=(d[a1]-f[u[i]]-(ld)l[i])/(ld)k+(ld)l[i]; 44 dfs2(u[i]); 45 } 46 return; 47 } 48 void zhao(int a1) 49 { 50 v[a1]=++now; 51 for(int i=head[a1];i;i=next[i]) 52 if(!v[u[i]]) 53 { 54 fa[u[i]]=a1; 55 zhao(u[i]); 56 } 57 else if(u[i]!=fa[a1]&&v[a1]>v[u[i]]) 58 { 59 c[u[i]]=1; 60 for(;a1!=u[i];) 61 { 62 c[a1]=1; 63 a1=fa[a1]; 64 } 65 } 66 return; 67 } 68 void huan(int a1,int fa) 69 { 70 bool kg=1; 71 g[a1]=0.00000; 72 for(int i=head[a1];i;i=next[i]) 73 if(c[u[i]]&&u[i]!=fa&&u[i]!=root) 74 { 75 kg=0; 76 huan(u[i],a1); 77 g[a1]+=g[u[i]]+(ld)l[i]; 78 } 79 if(a1==root) 80 return; 81 int k=du[a1]; 82 if(!k) 83 k++; 84 if(kg) 85 g[a1]=d[a1]/(ld)k; 86 else 87 { 88 k=du[a1]+1; 89 g[a1]=(g[a1]+d[a1])/(ld)k; 90 } 91 } 92 int main() 93 { 94 scanf("%d%d",&n,&m); 95 for(int i=1;i<=m;i++) 96 { 97 int a1,a2,a3; 98 scanf("%d%d%d",&a1,&a2,&a3); 99 jia(a1,a2,a3);100 jia(a2,a1,a3);101 }102 if(n==m+1)103 {104 root=1;105 dfs1(1);106 for(int i=1;i<=n;i++)107 v[i]=0;108 dfs2(1);109 }110 else111 {112 zhao(1);113 for(int i=1;i<=n;i++)114 v[i]=0;115 for(int i=1;i<=n;i++)116 if(c[i])117 {118 root=i;119 dfs1(i);120 }121 for(int i=1;i<=n;i++)122 if(c[i])123 {124 root=i;125 huan(i,0);126 gg[i]=g[i];127 }128 for(int i=1;i<=n;i++)129 if(c[i])130 {131 du[i]+=2;132 d[i]+=gg[i];133 }134 for(int i=1;i<=n;i++)135 v[i]=0;136 for(int i=1;i<=n;i++)137 if(c[i])138 dfs2(i);139 }140 double ans=0.00000;141 for(int i=1;i<=n;i++)142 ans+=d[i]/(ld)du[i];143 printf("%.5lf\n",ans/(double)n);144 return 0;145 }

基环树DP,先处理环外的子树,在递归处理环上的点。

转载于:https://www.cnblogs.com/xydddd/p/5309011.html

你可能感兴趣的文章
Spring事务管理配置以及异常处理
查看>>
【SP26073】DIVCNT1 - Counting Divisors 题解
查看>>
Postman 添加get请求和post请求
查看>>
UVA10140 Prime Distance
查看>>
Java正确URL解码方式:URLDecoder.decode
查看>>
类的 接口&抽象类思想、多态、反射、异常处理
查看>>
three.js 使用OrbitControls.js自由视角观察
查看>>
通过静态分析和持续集成 保证代码的质量 (PRQA )2
查看>>
LeetCode OJ:Invert Binary Tree(反转二叉树)
查看>>
C#4 for循环 迭代法 穷举法应用
查看>>
人机大战结束:AlphaGo 4:1 击败李世石
查看>>
(转)Javascript面向(基于)对象编程
查看>>
【Prince2科普】Prince2的七大原则(6)
查看>>
运维笔记--ubuntu rm删除文件后 恢复
查看>>
Android学习笔记--Gridview的两个神奇属性
查看>>
第15章 枚举类型和位标志
查看>>
ip sevices
查看>>
Python进阶07 函数对象
查看>>
【转】转换到 COFF 期间失败: 文件无效或损坏
查看>>
java 面向对象
查看>>