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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Codeforces 362E Petya and Pipes 费用流建图

發(fā)布時間:2025/3/13 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces 362E Petya and Pipes 费用流建图 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題意:

給一個網(wǎng)絡(luò)中某些邊增加容量,增加的總和最大為K,使得最大流最大。

費(fèi)用流:在某條邊增加單位流量的費(fèi)用。

那么就可以2個點(diǎn)之間建2條邊,第一條給定邊(u,v,x,0)這條邊費(fèi)用為0

同時另一條邊(u,v,K,1)費(fèi)用為1,那么就可以通過限制在增廣時相應(yīng)的費(fèi)用即可找出最大流

個人覺得這樣做的原因是每次增光都是最優(yōu)的。所以通過限制最終費(fèi)用不超過K可以得到最優(yōu)解

#include <map> #include <set> #include <list> #include <cmath> #include <ctime> #include <deque> #include <stack> #include <queue> #include <cctype> #include <cstdio> #include <string> #include <vector> #include <climits> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define LL long long #define PI 3.1415926535897932626 using namespace std; int gcd(int a, int b) {return a % b == 0 ? b : gcd(b, a % b);} const int MAXN = 110; const int INF = 0x3f3f3f3f; struct node {int u,v,next;int flow,cap,cost; }edge[MAXN * MAXN * 4]; int cnt,src,tag; int C,F; int K,N; queue<int>q; bool inq[MAXN];int d[MAXN]; int head[MAXN],p[MAXN]; int tot = 0;void init() {memset(head,-1,sizeof(head));tot = 0; }void add_edge(int u,int v,int cap,int cost) {edge[cnt].u = u;edge[cnt].v = v;edge[cnt].cap = cap;edge[cnt].flow = 0;edge[cnt].cost = cost;edge[cnt].next = head[u];head[u] = cnt++;//反向edge[cnt].v = u;edge[cnt].u = v;edge[cnt].flow = 0;edge[cnt].cap = 0;edge[cnt].cost = - cost;edge[cnt].next = head[v];head[v] = cnt++; }bool SPFA(int s, int t) {while (!q.empty()) q.pop();memset(inq,false,sizeof(inq));memset(d,0x3f,sizeof(d));memset(p,-1,sizeof(p));d[s] = 0;q.push(s);inq[s] = true;while (!q.empty()){int u = q.front(); q.pop();inq[u] = false;for (int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].v;if (d[v] > d[u] + edge[i].cost && edge[i].cap > edge[i].flow){d[v] = d[u] + edge[i].cost;p[v] = i;if (!inq[v]){q.push(v);inq[v] = true;}}}}if(d[tag] == INF) return false;int a = INF;for (int i = p[tag]; i != -1; i = p[edge[i].u])a = min(a,edge[i].cap - edge[i].flow);if(C + d[tag] * a > K){F += (K - C) / d[tag];return false;}return true; } void slove() {C = F = 0;while(SPFA(src,tag)){int a = INF;for (int i = p[tag]; i != -1; i = p[edge[i].u])a = min(a,edge[i].cap - edge[i].flow);for (int i = p[tag]; i != -1; i = p[edge[i].u]){edge[i].flow += a;edge[i ^ 1].flow -= a;}C += d[tag] * a;F += a;} }int main() {while (scanf("%d%d",&N,&K) != EOF){init();for (int i = 1 ; i <= N ; i++)for (int j = 1 ; j <= N ; j++){int x;scanf("%d",&x);if (x){add_edge(i,j,x,0);add_edge(i,j,K,1);}}src = 1;tag = N;slove();printf("%d\n",F);}return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/Commence/p/4928476.html

總結(jié)

以上是生活随笔為你收集整理的Codeforces 362E Petya and Pipes 费用流建图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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