HNOI2009 最小圈 二分答案 負環

2022-04-28 19:36:13 字數 2079 閱讀 6362

考慮帶權的有向圖 $ g=(v,e) $ 以及 $ w:e\rightarrow r $ ,每條邊 $ e=(i,j)(i\neq j,i\in v,j\in v) $ 的權值定義為 $ w_ $ ,令 $ n=|v| $ 。 $ c=(c_1,c_2,\cdots,c_k)(c_i\in v) $ 是 $ g $ 中的乙個圈當且僅當 $ (c_i,c_)(1\le i\lt k) $ 和 $ (c_k,c_1) $ 都在 $ e $ 中,這時稱 $ k $ 為圈 $ c $ 的長度同時令 $ c_=c_1 $ ,並定義圈 $ c=(c_1,c_2,\cdots,c_k) $ 的平均值為 $ \mu(c)=\sum\limits_^ w_}/k $ ,即 $ c $ 上所有邊的權值的平均值。令 $ \mu'(c)=min(\mu(c)) $ 為 $ g $ 中所有圈 $ c $ 的平均值的最小值。現在的目標是:在給定了乙個圖 $ g=(v,e) $ 以及 $ w:e\rightarrow r $ 之後,請求出 $ g $ 中所有圈 $ c $ 的平均值的最小值 $ \mu'(c)=min(\mu(c)) $

第一行2個正整數,分別為 $ n $ 和 $ m $ ,並用乙個空格隔開,只用 $ n=|v|,m=|e| $ 分別表示圖中有 $ n $ 個點 $ m $ 條邊。

接下來m行,每行3個數 $ i,j,w_ $ ,表示有一條邊 $ (i,j) $ 且該邊的權值為 $ w_ $ 。輸入資料保證圖 $ g=(v,e) $ 連通,存在圈且有乙個點能到達其他所有點。

請輸出乙個實數 $ \mu'(c)=min(\mu(c)) $ ,要求輸出到小數點後8位。

4 51 2 5

2 3 5

3 1 5

2 4 3

4 1 3

3.66666667

2 21 2 -2.9

2 1 -3.1

-3.00000000

對於100%的資料, $ n\le 3000,m\le 10000,|w_| \le 10^7 $

這道題要我們求平均值的最小值,所以我們考慮二分答案的可能性,先列出答案的意義:

$ ans=\frac^ w_}}\quad _=c_1)} $

我們將它轉換一下:

$ ans\times k=^ w_}}\quad _=c_1)} $

$ 0=\sum\limits_^ (w_})-ans\times k\quad _=c_1)} $

$ 0=\sum\limits_^(w_}-ans)\quad _=c_1)} $

這樣我們發現它已經化成了乙個二分答案的常用等式(等式右邊可以 $ o(n) $ 求出來,且具備單調性)而我們注意到等式左邊為0,所以我們可以二分ans,並將邊權改為 $ w_}-mid $ ,然後求負環即可。

為什麼可以這樣做呢?這個較**那一題好講一些,我們當前二分出來的平均值mid,我們將每一條邊的邊權都減去它,如果存在負環,說明這個環上所有邊權實際邊權值加起來的平均值一定小於mid!(這裡需要仔細想一下)

#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long

#define db double

#define inf 0x7fffffff

#define rg register int

using namespace std;

const db cha=1e-9;

struct sua[10005];

bool f;

int n,m,top;

int tou[3005];

bool vis[3005];

db mid,dis[3005];

inline int qr()

inline void add(int x,int y)

inline void spfa(int i)

}vis[i]=0;

}inline bool check()

int main()printf("%.8lf\n",l);

return 0;

}

洛谷 P3199 HNOI2009 最小圈

如果你能提供題面或者題意簡述,請直接在討論區發帖,感謝你的貢獻。對於一張有向圖,要你求圖中最小圈的平均值最小是多少,即若乙個圈經過k個節點,那麼乙個圈的平均值為圈上k條邊權的和除以k,現要求其中的最小值 輸入格式 第一行2個正整數,分別為n和m 以下m行,每行3個數,表示邊連線的資訊,輸出格式 一行...

二分查詢與二分答案

主要用於在乙個單調的函式中查詢某值 連續函式的情況 若當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y 則 l mid,否則 r mid 直至 r l eps 當前查詢的區間是 l,r 查詢的值是 y 函式單增 設 mid l r 2 若 f mid y...

二分查詢和二分答案

1.解釋 優點 查詢速度快。缺點 待查表為有序表。4.時間複雜度 o log n 5.示例 p2249查詢 include include using namespace std long long n,m,a 1000005 b 100005 l,r,mid,cnt,x intmain for i...