BZOJ 3143: [Hnoi2013] + walk desired probability Gaussian elimination

Code: 

#include <cmath>         
#include <cstdio> 
#include <algorithm>  
#define N 503 
#define M 205089
#define setIO(s) freopen(s".in","r",stdin) 
using namespace std;   
double f[N][N],G[M];       
int edges; 
int hd[N],to[M<<1],nex[M<<1],deg[N],U[M],V[M];    
void add(int u,int v) 
{
    nex[++edges]=hd[u],hd[u]=edges,to[edges]=v; 
}
void Gauss(int n) 
{ 
    int i,j,k,now; 
    for(i=1;i<=n;++i) 
    {
        now=i;          
        for(j=i;j<=n;++j) 
        {
            if(fabs(f[j][i])>fabs(f[now][i])) now=j;   
        } 
        if(now!=i) 
        {
            for(j=1;j<=n;++j) swap(f[i][j],f[now][j]); 
        } 
        if(f[i][i]) 
        { 
            for(j=i+1;j<=n+1;++j) f[i][j]/=f[i][i]; 
            f[i][i]=1; 
        }
        for(j=i+1;j<=n;++j) 
        {
            double div=f[j][i];    
            for(k=i+1;k<=n+1;++k) f[j][k]-=div*f[i][k];                                          
            f[j][i]=0; 
        }  
    } 
    for(i=n;i>=1;--i) 
    {
        for(j=i+1;j<=n;++j) 
        {
            f[i][n+1]-=f[j][n+1]*f[i][j];    
        }
    }
}                    
int main() 
{ 
    int i,j,n,m; 
    // setIO("input");     
    scanf("%d%d",&n,&m);    
    for(i=1;i<=m;++i) 
    {
        int u,v; 
        scanf("%d%d",&u,&v),add(u,v),add(v,u),++deg[u],++deg[v],U[i]=u,V[i]=v;  
    }  
    f[1][n]=1.0; 
    for(i=1;i<n;++i) 
    {
        f[i][i]=1; 
        for(j=hd[i];j;j=nex[j]) 
        {
            int v=to[j]; 
            if(v==n) continue;    
            f[i][v]=-1.0/deg[v];        
        }
    } 
    Gauss(n-1);    
    for(i=1;i<=m;++i) 
    {
        int a=U[i],b=V[i];
        if(a!=n) 
        { 
            G[i]+=f[a][n]*(1.0/deg[a]);    
        } 
        if(b!=n) 
        { 
            G[i]+=f[b][n]*(1.0/deg[b]);  
        }
    } 
    sort(G+1,G+1+m);   
    double ans=0; 
    for(i=1;i<=m;++i) 
    {
        ans+=G[i]*((m-i+1)*1.0); 
    } 
    printf("%.3lf\n",ans); 
    return 0;    
}

  

Guess you like

Origin www.cnblogs.com/guangheli/p/11528077.html