題目鏈結
給你乙個\(n\)個點\(m\)條邊的無向連通圖從 1 號點出發,每次隨機選擇當前頂點的某條邊走到下乙個點,並獲得這條邊的分數,分數為這條邊的編號,一旦到了\(n\)號點就結束遊走,總分為獲得分數的總和。安排每條邊的編號,使總分的期望值最小,並輸出最小的期望值
看完題目能夠發現,我們只要求出經過每一條邊的期望,再把小的編號安排到期望值大的邊上,把大的編號安排到期望值小的邊上,就可以使總分的期望值最小
分析一波,發現邊的期望值並不好求,但是可以先求出點的期望值
顯然,每個點的期望是由相連的點的期望決定的。設\(f[x]\)為點\(x\)的期望, \(du[x]\)為點\(x\)的度數,點\(x1,x2,x3....xk\)與點\(x\)相鄰,則\(f[x]= \sum_^k \frac \)
這樣,點的期望值就轉化為了乙個方程組,這個時候就要用到我們的高斯消元了,不過要注意的是,因為到了點\(n\)就會停止遊走,所以點\(n\)的期望是不用管的。還有,因為起點為1號點,所以點1的實際期望為原期望+1
接下來要做的就是把點的期望轉化為邊的期望,每條邊的期望都由其連線的兩個端點決定,最後排個序,安排一下編號即可
最後上**
#include using namespace std;
const double eps = 1e-8;
double a[503][503], b[503], f[503], chu, ff[1000000], sum, du[503];
int n, m, max1, x, y, bian[1000000], bian1[1000000];
vectorl[503];
signed main()
b[1] = 1;
for (int i = 1; i < n; i++)
for (int i = 1; i < n; i++)
}for (int i = n - 1; i >= 1; i--)
for (int i = 1; i <= m; i++)
ff[i] = f[bian[i]] / (double)du[bian[i]] + f[bian1[i]] / (double)du[bian1[i]];
sort(ff + 1, ff + m + 1);
for (int i = 1; i <= m; i++) sum += ff[i] * (double)(m - i + 1);
printf("%.3lf", sum);
return 0;
}
題解 lg3232 HNOI2013 遊走
給定乙個 n個點 m 條邊的無向連通圖,頂點從 1 編號到 n,邊從 1編號到 m。小 z 在該圖上進行隨機遊走,初始時小 z 在 1號頂點,每一步小 z 以相等的概率隨機選擇當前頂點的某條邊,沿著這條邊走到下乙個頂點,獲得等於這條邊的編號的分數。當小 z 到達 n 號頂點時遊走結束,總分為所有獲得...
遊走 HNOI2013 期望Dp 高斯消元
vjudge 乙個無向連通圖,頂點從1編號到n,邊從1編號到m。小z在該圖上進行隨機遊走,初始時小z在1號頂點,每一步小z以相等的概率隨機選 擇當前頂點的某條邊,沿著這條邊走到下乙個頂點,獲得等於這條邊的編號的分數。當小z 到達n號頂點時遊走結束,總分為所有獲得的分數之和。現在,請你對這m條邊進行編...
HNOI2013 比賽 搜尋
搜尋。lg傳送門 直接暴力有60,考場上寫的60,結果掛成40。考慮在暴力的同時加個記憶化,把剩下的球隊數和每支球隊的得分情況hash一下,每次搜到還剩 t 個隊的時候就在雜湊表裡找一下,有就拿來算答案,沒有就把這次的結果存進雜湊表。複雜度 o 能過 include include include ...