bzoj
首先,概率不會直接算。。。
所以來乙個逼近法算概率
這樣就可以求出每一條邊的概率
隨著走的步數的增多,答案越接近
(我卡到
5000
步可以拿
50 分)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define ll long long
#define rg register
#define max 520
#define maxl 500000
inline
int read()
struct linee[maxl];
int h[max],cnt=2;
int n,m,op[max];
inline
void add(int u,int v);h[u]=cnt++;op[u]++;}
double v[max*max];
double f[2][max];
int main()
f[0][1]=1;
for(int st=1,nw=1,nt=0;st<=5000;++st,nw^=1,nt^=1)
sort(&v[1],&v[m+1]);
double ans=0;
for(int i=m;i;--i)
ans+=i*v[m-i+1];
printf("%.3lf\n",ans);
return
0;}
這樣子算出來會有精度問題
所以就掛了
現在考慮怎麼算這個概率
顯然不能dp
那麼,看看每乙個點的概率是怎麼來的 f[
i]=∑
edge
(u,i
)f[u
]op[
u]其中,op
[u] 是
u 的出度
那麼,現在我有
n個未知數(每個的概率) 以及n
個方程(每個點的概率就是怎麼算出來的)
大力用高斯消元解一下就好了
算出來之後貪心
就沒有問題啦
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define ll long long
#define rg register
#define max 520
#define maxl 500000
inline
int read()
struct linee[maxl];
int h[max],cnt=2;
int n,m,op[max];
inline
void add(int u,int v);h[u]=cnt++;op[u]++;}
double v[max*max];
double g[max][max];
double f[max];
void build()
void guess()
}for(int i=n;i;--i)
}int main()
build();guess();
for(int u=1;ufor(int i=h[u];i;i=e[i].next)
v[i>>1]+=f[u]/op[u];
double ans=0;
sort(&v[1],&v[m+1]);
for(int i=m;i;--i)
ans+=i*v[m-i+1];
printf("%.3lf\n",ans);
return
0;}
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條邊進行編號,使得小...