BZOJ 3143 遊走(高斯消元)

2022-05-09 02:00:07 字數 1199 閱讀 4334

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

思路:顯然,需要求出每條邊的期望經過次數,然後排序貪心賦值即可,但是每條邊的期望經過次數是什麼呢?

是 e(e)=e(u)/d(u) + e(v)/d(v) (u,v∈e)

所以做法就是先求出每個點的期望經過次數,還有,就是對於第n個點,它的期望在最後統計的時候要看做0,因為到了n點就不會再出來了。

1 #include2 #include3 #include4 #include5 #include6

struct

edgee[500005

];10

int n,m,du[500005],go[1005][1005

];11

double a[1010][1010],p[500005

];12

bool

cmp(edge q,edge w)

15void

gauss()

29 now++;30}

31}32int

main()

45 m=tot;

46for (int i=1;i1;47

for (int i=1;i)53}

54 n--;

55 a[1][n+1]=1;56

gauss();

57for (int i=1;i<=n;i++) p[i]=a[i][n+1

];58

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

59 e[i].w=((double)p[e[i].u])/((double)du[e[i].u])+((double)p[e[i].v])/((double

)du[e[i].v]);

60 std::sort(e+1,e+1+m,cmp);

61double ans=0;62

for (int i=1;i<=m;i++) ans+=e[i].w*i;

63 printf("

%.3f\n

",ans);

64 }

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條邊進行編號,使得小...

BZOJ3143 遊走(高斯消元,數學期望)

bzoj 首先,概率不會直接算。所以來乙個逼近法算概率 這樣就可以求出每一條邊的概率 隨著走的步數的增多,答案越接近 我卡到 5000 步可以拿 50 分 include include include include include include include include include ...