• bzoj3143游走


    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3143

    学到了无向图中点被经过的期望次数和边被经过的期望次数。

    一个点被经过的期望次数  就是  与它相连的点被经过的期望次数/那个点的度数  的求和。

    https://www.cnblogs.com/owenyu/p/6724721.html这个博客说的很好。

      该博客让我受到的启发就是一个点被经过的期望次数是依赖于与它相连的点的,可是要算它的时候相连点还没算出来,算相连点又要用到它的数据,令人头痛。

        而如果是有向图中,就可以以拓扑序为计算顺序了。

        而再想想无向图中计算的形式,不就很适合列方程吗!还有高斯消元这个好方法去解方程!

    列式子可知移项后f [ i ] [ i ]的系数一定是-1。相连点的系数就是1/其度数。

    需要注意的是自己一开始就在1点,不需要从别的点走过来就自带1次;

    而从n点不能走到其他点!

    自己写高斯消元总是犯的错误:第 i 行把第 i 个未知数的系数调成1时   要么倒序,要么另存!

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int N=505,M=250005;
    int n,m,du[N],u[M],v[M];
    double a[N],f[N][N],s[M],ans;
    void init()
    {
        for(int i=1;i<n;i++)f[i][i]=-1;
        f[1][n+1]=-1;
    //    a[n]=1;        //一条边不能从n点走回来!所以算边的时候n点应视为0! 
        for(int i=1;i<=m;i++)
            f[u[i]][v[i]]=1.0/du[v[i]],
            f[v[i]][u[i]]=1.0/du[u[i]];
    }
    void gauss()
    {
        for(int i=1;i<n;i++)
        {
            for(int j=n+1;j>=i;j--)f[i][j]/=f[i][i];//要么倒序,要么另存! 
            for(int j=i+1;j<n;j++)
                for(int k=n+1;k>=i;k--)
                    f[j][k]-=f[j][i]*f[i][k];
        }
        for(int i=n-1;i;i--)
        {
            a[i]=f[i][n+1];
            for(int j=i-1;j;j--)
                f[j][n+1]-=f[j][i]*a[i];
        }
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d%d",&u[i],&v[i]);
            du[u[i]]++;du[v[i]]++;
        }
        init();gauss();
    //    for(int i=1;i<=n;i++)
    //        printf("[%.3lf]",a[i]);printf("
    ");
        for(int i=1;i<=m;i++)
            s[i]=a[u[i]]/du[u[i]]+a[v[i]]/du[v[i]];
        sort(s+1,s+m+1);
    //    for(int i=1;i<=m;i++)
    //        printf("(%.3lf)",s[i]);printf("
    ");
        for(int i=1,j=m;i<=m;i++,j--)
            ans+=s[i]*j;
        printf("%.3lf",ans);
        return 0;
    }
  • 相关阅读:
    470. 用 Rand7() 实现 Rand10() 采样
    165. 比较版本号 字符串
    Java 通过属性名称读取或者设置实体的属性值
    双非Java的学习之旅以及秋招路程
    【Unity3D】不可读Texture资源的获取
    java 8 Map 之merge用法
    Jmeter-计数器的应用
    Jmeter-集合点【同步定时器】应用
    2. Go并发编程--GMP调度
    Go序列化嵌套结构体
  • 原文地址:https://www.cnblogs.com/Narh/p/9048985.html
Copyright © 2020-2023  润新知