博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2018.09.23 bzoj3143: [Hnoi2013]游走(dp+高斯消元)
阅读量:5366 次
发布时间:2019-06-15

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

显然只需要求出所有边被经过的期望次数,然后贪心把边权小的边定城大的编号。
所以如何求出所有边被经过的期望次数?
显然这只跟边连接的两个点有关。
于是我们只需要求出两个点被经过的期望次数。
对于一个点uuu,它被经过的期望次数f[u]=∑vf[v]/du[v]f[u]=\sum _v f[v]/du[v]f[u]=vf[v]/du[v]
这是一个环上的递推式,我们可以用高斯消元解方程组。
代码:

#include
#define N 505#define M 250005using namespace std;int n,m,du[N];double matrix[N][N],f[N],ans=0.0;bool tran[N][N];struct edge{
int u,v;double w;}e[M];inline bool cmp(edge a,edge b){
return a.w
fabs(matrix[tmp][i]))tmp=j; if(tmp^i)swap(matrix[i],matrix[tmp]); for(int j=i+1;j<=n;++j){
double ttmp=matrix[j][i]/matrix[i][i]; for(int k=i;k<=n+1;++k)matrix[j][k]-=matrix[i][k]*ttmp; } } for(int i=n;i;--i){
for(int j=i+1;j<=n;++j)matrix[i][n+1]-=matrix[i][j]*f[j]; f[i]=matrix[i][n+1]/matrix[i][i]; }}inline int read(){
int ans=0; char ch=getchar(); while(!isdigit(ch))ch=getchar(); while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar(); return ans;}int main(){
n=read(),m=read(); for(int i=1;i<=m;++i){
++du[e[i].u=read()],++du[e[i].v=read()]; tran[e[i].u][e[i].v]=tran[e[i].v][e[i].u]=true; } matrix[1][n]=1; for(int i=1;i<=n;++i)matrix[i][i]=1; for(int i=1;i

转载于:https://www.cnblogs.com/ldxcaicai/p/9738224.html

你可能感兴趣的文章
一段sql的优化
查看>>
十进制与十六进制的相互转换
查看>>
在Flex中用Validator检测数字、字符串、Email.
查看>>
[leetcode]4Sum
查看>>
POJ1062 昂贵的聘礼
查看>>
【零基础学习iOS开发】【02-C语言】08-基本运算
查看>>
Java 将指定字符串连接到此字符串的结尾 concat()
查看>>
Hibernate Criterion
查看>>
Python知识
查看>>
我们为什么要搞长沙.NET技术社区(三)
查看>>
杭电acm Cake
查看>>
js函数中this的指向
查看>>
c++ 引用方式传递数组
查看>>
HBase学习之路 (九)HBase phoenix的使用
查看>>
LeetCode() Remove Duplicates from Sorted Array II
查看>>
【svn】idea svn 文件上会出现一个破书
查看>>
cocos2d-x 3.0 场景切换特效汇总(转)
查看>>
The SortedMap Interface
查看>>
SniperOJ-leak-x86-64
查看>>
bzoj 4260: Codechef REBXOR (01 Trie)
查看>>