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("\n");
    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("\n");
    for(int i=1,j=m;i<=m;i++,j--)
        ans+=s[i]*j;
    printf("%.3lf",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/Narh/p/9048985.html

时间: 2024-11-13 08:09:14

bzoj3143游走的相关文章

bzoj3143 游走

Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数.当小Z 到达N号顶点时游走结束,总分为所有获得的分数之和. 现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小. Input 第一行是正整数N和M,分别表示该图的顶点数 和边数,接下来M行每行是整数u,v(1≤u,v≤N),表示顶点u与顶点v之间存在一条边. 输

bzoj3143 游走 概率 高斯消元

链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3143 题目大意是说:给出一张无向图,找出一种加权值的方式,使得从1到n期望带权路径长度最短,输出最短路长度. 首先,根据基本常识,走的次数多的边,权值越小越好(废话). 于是问题转变为:找出每条边的期望经过次数. 设i边期望经过次数为f[i],则f[i]就为两个端点期望经过次数与走到这条边概率之商的和(没看懂?就是f[i]=x[duan1]/du[duan1]+x[duan2]/du[dua

【BZOJ3143】[Hnoi2013]游走 期望DP+高斯消元

[BZOJ3143][Hnoi2013]游走 Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数.当小Z 到达N号顶点时游走结束,总分为所有获得的分数之和. 现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小. Input 第一行是正整数N和M,分别表示该图的顶点数 和边数,接下来M行每行是整数u,v(1≤u,v

bzoj3143 [Hnoi2013]游走

Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数.当小Z 到达N号顶点时游走结束,总分为所有获得的分数之和. 现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小. Input 第一行是正整数N和M,分别表示该图的顶点数 和边数,接下来M行每行是整数u,v(1≤u,v≤N),表示顶点u与顶点v之间存在一条边. 输

BZOJ3143 - HNOI2013游走【高斯消元】

Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数.当小Z 到达N号顶点时游走结束,总分为所有获得的分数之和. 现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小. Input 第一行是正整数N和M,分别表示该图的顶点数 和边数,接下来M行每行是整数u,v(1≤u,v≤N),表示顶点u与顶点v之间存在一条边. 输

【BZOJ-3143】游走 高斯消元 + 概率期望

3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status][Discuss] Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数.当小Z 到达N号顶点时游走结束,总分为所有获得的分数

bzoj3143【HNOI2013】游走

3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1962  Solved: 874 [Submit][Status][Discuss] Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数.当小Z 到达N号顶点时游走结束,总分为所有获得的

【BZOJ3143】[Hnoi2013]游走

一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数.当小Z 到达N号顶点时游走结束,总分为所有获得的分数之和. 现在,请你对这M条边进行编号,使得小Z获得的总分的期望值最小. 期望次数大的标号应该小 p[e] = p[e.x] / out[e.x] + p[e.y] / out[e.y] 剩下的和3270相同 #include <iostream

bzoj3143 luogu3232 游走

3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 4289  Solved: 2008[Submit][Status][Discuss] Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分数.当小Z 到达N号顶点时游走结束,总分为所有获得的分