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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 3572(最大流)

發布時間:2025/3/16 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 3572(最大流) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

建圖:把每個任務和每一天都看做一個點,添加源點和匯點。源點與每個任務之間連一條邊,容量為完成該任務所需處理次數。若第i個任務可以在Si至Ei天處理,則由該任務向這些天分別連一條邊,容量為1,表示此任務每天只能被處理一次。最后,從每一天連一條到匯點的邊,容量為機器數M,表示每天可以處理M個任務。若求出的最大流等于所有任務需要處理的次數之和,說明能完成任務;否則,不能完成任務。


AC:

#include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <algorithm>using namespace std;const int maxn = 1111; const int maxm = 505000; const int oo = 1 << 30;int idx; int cur[maxn], pre[maxn]; int dis[maxn], gap[maxn]; int aug[maxn], head[maxn];struct Node {int u, v, w;int next; }edge[maxm];void addEdge(int u, int v, int w) {edge[idx].u = u;edge[idx].v = v;edge[idx].w = w;edge[idx].next = head[u];head[u] = idx++;edge[idx].u = v;edge[idx].v = u;edge[idx].w = 0;edge[idx].next = head[v];head[v] = idx++; }int SAP(int s, int e, int n) {int max_flow = 0, v, u = s;int id, mindis;aug[s] = oo;pre[s] = -1;memset(dis, 0, sizeof(dis));memset(gap, 0, sizeof(gap));gap[0] = n; // 我覺得這一句要不要都行,因為dis[e]始終為0for (int i = 0; i <= n; ++i){ // 初始化當前弧為第一條弧cur[i] = head[i];}while (dis[s] < n){bool flag = false;if (u == e){max_flow += aug[e];for (v = pre[e]; v != -1; v = pre[v]) // 路徑回溯更新殘留網絡{id = cur[v];edge[id].w -= aug[e];edge[id^1].w += aug[e];aug[v] -= aug[e]; // 修改可增廣量,以后會用到if (edge[id].w == 0) u = v; // 不回退到源點,僅回退到容量為0的弧的弧尾}}for (id = cur[u]; id != -1; id = edge[id].next){ // 從當前弧開始查找允許弧v = edge[id].v;if (edge[id].w > 0 && dis[u] == dis[v] + 1) // 找到允許弧{flag = true;pre[v] = u;cur[u] = id;aug[v] = min(aug[u], edge[id].w);u = v;break;}}if (flag == false){if (--gap[dis[u]] == 0) break; /* gap優化,層次樹出現斷層則結束算法 */mindis = n;cur[u] = head[u];for (id = head[u]; id != -1; id = edge[id].next){v = edge[id].v;if (edge[id].w > 0 && dis[v] < mindis){mindis = dis[v];cur[u] = id; // 修改標號的同時修改當前弧}}dis[u] = mindis + 1;gap[dis[u]]++;if (u != s) u = pre[u]; // 回溯繼續尋找允許弧}}return max_flow; }int main() {int t, n, m, pi, si, ei;int Max, sum, source, sink, vn;scanf("%d", &t);for (int cas = 1; cas <= t; ++cas){idx = 0;memset(head, -1, sizeof(head));sum = 0; source = 0; Max = 0;scanf("%d %d", &n, &m);for (int i = 1; i <= n; ++i){scanf("%d %d %d", &pi, &si, &ei);sum += pi;Max = max(Max, ei);addEdge(source, i, pi);for (int j = si; j <= ei; ++j){addEdge(i, n + j, 1);}}sink = n + Max + 1;vn = sink + 1;for (int i = 1; i <= Max; ++i){addEdge(n + i, sink, m);}if (SAP(source, sink, vn) == sum)printf("Case %d: Yes\n\n", cas);else printf("Case %d: No\n\n", cas);}return 0; }

總結

以上是生活随笔為你收集整理的hdu 3572(最大流)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。