題目大意是說:給出一張無向圖,找出一種加權值的方式,使得從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 #include6using
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條邊進行編號,使得小...