zoukankan      html  css  js  c++  java
  • 「HNOI2013」游走

    传送门

    Description

    随机游走,每条边的代价是边的序号,问从 (1)(n) 的最小期望距离

    你需要给边标号

    Solution

    答案是

    [sum_{i=1}^m E[i] imes id[i] ]

    所以把每条边的期望经过次数算出来排个序就好了

    边的期望经过次数可以转化成点的

    [E[<u,v>]=frac{F[u]}{deg[u]}+frac{F[v]}{deg[v]} ]

    所以只要算出每个点经过的次数就好了

    所以就是

    [F[i]=[i=1]+sum_{<i,j>,j e n}frac{F[j]}{deg[j]} ]

    所以高斯消元就好了


    Code 

    #include<bits/stdc++.h>
    #define ll long long
    #define dbg1(x) cerr<<#x<<"="<<(x)<<" "
    #define dbg2(x) cerr<<#x<<"="<<(x)<<"
    "
    #define dbg3(x) cerr<<#x<<"
    "
    using namespace std;
    #define reg register
    inline int read()
    {
    	int x=0,f=1;char ch=getchar();
    	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    	return x*f;
    }
    const int MN=505;
    int deg[MN],n,m,u[MN*MN],v[MN*MN];
    #define db double
    db E[MN*MN],F[MN],b[MN][MN],ans=0.;
    std::vector<int> G[MN];
    void Gauss()
    {
    	reg int i,j,k;
    	for(i=1;i<n;++i)
    	{
    		int p=i;
    		for(j=i+1;j<n;++j)if(fabs(b[j][i])>fabs(b[p][i]))p=j;
    		if(i!=p)swap(b[i],b[p]);
    		for(j=i+1;j<n;++j)
    		{
    			db d=b[j][i]/b[i][i];
    			for(k=i;k<=n;++k) b[j][k]-=d*b[i][k];
    		}
    	}
    	for(i=n-1;i;--i)
    	{
    		for(j=i+1;j<n;++j)b[i][n]-=F[j]*b[i][j];
    		F[i]=b[i][n]/b[i][i];
    	}
    }
    int main()
    {
    	n=read();m=read();
    	reg int i,j,x,y;
    	for(i=1;i<=m;++i)
    	{
    		u[i]=x=read();v[i]=y=read();
    		G[x].push_back(y);G[y].push_back(x);
    		++deg[x];++deg[y];
    	}
    	for(b[1][n]=i=1;i<n;++i)
    	{
    		b[i][i]=1.;
    		for(j=0;j<G[i].size();++j)
    		if(G[i][j]!=n)
    		b[i][G[i][j]]=-1./deg[G[i][j]];
    	}
    	Gauss();
    	for(i=1;i<=m;++i)
    	{
    		if(u[i]!=n)E[i]+=F[u[i]]/(db)deg[u[i]];
    		if(v[i]!=n)E[i]+=F[v[i]]/(db)deg[v[i]];
    	}
    	std::sort(E+1,E+m+1);
    	for(i=1;i<=m;++i)ans+=(db)i*E[m-i+1];
    	return 0*printf("%.3lf
    ",ans);
    }
    


    Blog来自PaperCloud,未经允许,请勿转载,TKS!

  • 相关阅读:
    linux防火墙iptables
    etc/fstab
    EDT改成CST
    echo
    dd
    chown
    CAT
    Linux grep
    CHECKSUM比较两表字段值差异
    通过GitHub部署项目到Nginx服务器
  • 原文地址:https://www.cnblogs.com/PaperCloud/p/11872955.html
Copyright © 2011-2022 走看看