【BZOJ 1486】 [HNOI2009]最小圈
【鏈接】 我是鏈接,點我呀:)
【題意】
在這里輸入題意
【題解】
我們可以只想那個均值最小的環(huán)。
我們不知道那個環(huán)由哪些邊構(gòu)成
但我們可以把每條邊都減掉mid
那個環(huán)受到的影響是什么呢?
如果這個均值最小的環(huán)的均值沒有mid那么大。
那么這個環(huán)就會變成負(fù)權(quán)環(huán)(因為\(環(huán)的均值<mid那么,環(huán)的均值*環(huán)的大小=這個環(huán)的邊權(quán)和<mid*環(huán)大小\))。
如果平均值比mid大
那么減掉之后顯然是不會變成負(fù)權(quán)環(huán)的。
由于這個環(huán)是最小環(huán)那么其他的環(huán)也不會變成負(fù)權(quán)環(huán)。
因此。我們可以根據(jù)是否出現(xiàn)了負(fù)權(quán)環(huán)。來修改這個mid的值。
顯然有單調(diào)性。那么二分答案即可。
判負(fù)權(quán)環(huán)的時候用了黑科技
dfs版的spfa..
每次優(yōu)先找負(fù)權(quán)的邊。
然后從那個邊的起點開始進行spfa.
走的路上不斷標(biāo)記某個點是否走過。
然后如果松弛條件滿足。
且目標(biāo)點已經(jīng)走過。
那么就說明找到了一個環(huán)。
【代碼】
#include <bits/stdc++.h> #define LL long long #define rep1(i,a,b) for (int i = a;i <= b;i++) #define rep2(i,a,b) for (int i = a;i >= b;i--) #define all(x) x.begin(),x.end() #define pb push_back #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 using namespace std;const double pi = acos(-1); const int dx[4] = {0,0,1,-1}; const int dy[4] = {1,-1,0,0}; const int N = 3000;int n,m; vector<pair<int,double> > g[N+10]; double dis[N+10]; bool vis[N+10],flag;void dfs(int x,double delta){vis[x] = 1;for (int i = 0;i < (int)g[x].size();i++){pair<int,double> temp = g[x][i];int y = temp.first;double cost = temp.second-delta;if (dis[y]>dis[x]+cost){if (vis[y]||flag){flag = true;break;}else{dis[y] = dis[x]+cost;dfs(y,delta);}}}vis[x] = 0; }bool ok(double delta){for (int i = 1;i <= n;i++) dis[i] = 0;flag = false;for (int i = 1;i <= n;i++)if (dis[i]==0){dfs(i,delta);}return flag; }int main(){#ifdef LOCAL_DEFINEfreopen("rush_in.txt", "r", stdin);#endifios::sync_with_stdio(0),cin.tie(0);cin >> n >> m;for (int i = 1;i <= m;i++){int x,y;double z;cin >> x >> y >> z;g[x].push_back(make_pair(y,z));}double l = -1e7-10,r = 1e7+10,temp = 0.0;for (int i = 1;i <= 100;i++){double mid = (l+r)/2.0;if (!ok(mid)){temp = mid;l = mid;}else{r = mid;}}cout<<fixed<<setprecision(8)<<temp<<endl;return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/AWCXV/p/9143218.html
總結(jié)
以上是生活随笔為你收集整理的【BZOJ 1486】 [HNOI2009]最小圈的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 3. 无重复字符的最长
- 下一篇: 错误本