bzoj3143 遊走 概率 高斯消元

2022-03-27 03:32:45 字數 1432 閱讀 5046

題目大意是說:給出一張無向圖,找出一種加權值的方式,使得從1到n期望帶權路徑長度最短,輸出最短路長度。

首先,根據基本常識,走的次數多的邊,權值越小越好(廢話)。

於是問題轉變為:找出每條邊的期望經過次數。

設i邊期望經過次數為f[i],則f[i]就為兩個端點期望經過次數與走到這條邊概率之商的和(沒看懂?就是f[i]=x[duan1]/du[duan1]+x[duan2]/du[duan2],x[i]表示i點期望經過次數,du[i]表示i點在圖中的度)。

問題進一步轉化為:找出每個點的期望經歷次數。

首先,由於我們走過終點就可以不走了,所以我們忽略掉n節點。

根據期望的線性性可以得出x[i]=sigma。

把每個點的情況都弄出來,就會發現這是乙個有n個變數,n個式子的線性方程組。

於是用死也打不對的高斯消元解決。

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7const

int maxn=505,maxm=500005;8

const

double eps=1e-7;9

struct

node

10edge[maxm];

13int

head[maxn],tot;

14void addedge(int u,int

v)15

;head[u]=tot;17}

18int

du[maxn],n,m;

19double

a[maxn][maxn],x[maxn],f[maxm];

20void

gauss()

2135

for(int i=num+1;i<=n;i++)

3642}43

for(int i=n;i>=1;i--)

4449}50

bool cmp(double a,double

b)51

54int

haha()

5565 a[1][n--]=-1;66

for(int i=1;i<=n;i++)

6775}76

gauss();

77for(int i=1;i<=tot;i++)

78 f[(i-1)>>1]+=x[edge[i].to]/du[edge[i].to];

79 sort(f,f+m,cmp);

80double ans=0;81

for(int i=0;i1

);82 printf("

%0.3lf\n

",ans);83}

84int sb=haha();

85int main()

BZOJ 3143 遊走 高斯消元

中文題目。f v 表示小z在圖上游走時,在v點走的次數 這樣就可以根據圖上的鏈結關係 構造出n個方程在求解既可 include include include include using namespace std const int maxn 500 5 const double eps 1e 4...

BZOJ 3143 遊走(高斯消元)

題意 乙個無向連通圖,頂點從1編號到n,邊從1編號到m。小z在該圖上進行隨機遊走,初始時小z在1號頂點,每一步小z以相等的概率隨機選擇當前頂點的某條邊,沿著這條邊走到下乙個頂點,獲得等於這條邊的編號的分數。當小z 到達n號頂點時遊走結束,總分為所有獲得的分數之和。現在,請你對這m條邊進行編號,使得小...

BZOJ 3143 遊走(高斯消元)

題意 乙個無向連通圖,頂點從1編號到n,邊從1編號到m。小z在該圖上進行隨機遊走,初始時小z在1號頂點,每一步小z以相等的概率隨機選擇當前頂點的某條邊,沿著這條邊走到下乙個頂點,獲得等於這條邊的編號的分數。當小z 到達n號頂點時遊走結束,總分為所有獲得的分數之和。現在,請你對這m條邊進行編號,使得小...