日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【BZOJ 1486】 [HNOI2009]最小圈

發(fā)布時間:2025/7/14 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【BZOJ 1486】 [HNOI2009]最小圈 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【鏈接】 我是鏈接,點我呀:)
【題意】


在這里輸入題意

【題解】

我們可以只想那個均值最小的環(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。