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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

21-5-22校赛G 自行车调度

發布時間:2025/3/12 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 21-5-22校赛G 自行车调度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

21-5-22校賽G 自行車調度

n個點,m條邊的無向帶正權圖(編號1到n)。每個點初始有a[i](0<=a[i]<=1e5,1<=i<=n)輛自行車,自行車管理員可以花費一個邊權的代價移動一輛自行車從邊的一端到另一端。求自行車管理員所需的最小的代價使每個點自行車數量相等(無解輸出-1)。

調度問題,百分之九十都是網絡流,這個題是圖上的費用流
直接在原圖跑費用流就好了啊,我在干什么,還建了個完全二分圖。。

const int N = 510, inf = 1e9; int a[N], head[N], num, now[N], s, t, dis[N]; long long ans = 0; bool vis[N];struct edge {int nxt, to, val, pri; }; edge e[1000010];void addEdge(int x, int y, int z, int w) {e[++ num].nxt = head[x];head[x] = num;e[num].to = y;e[num].val = z;e[num].pri = w; }bool spfa() {for (int i = 0; i <= t; i ++)dis[i] = inf;dis[s] = 0;queue <int> q;q.push(s);while (!q.empty()){int x = q.front(); q.pop();for (int i = head[x]; i != -1; i = e[i].nxt){int to = e[i].to;if (dis[to] > dis[x] + e[i].pri)if (e[i].val > 0){dis[to] = dis[x] + e[i].pri;q.push(to);}}}if (dis[t] != inf) return true;return false; }int dfs(int x, int flow) {if (vis[x]) return 0;vis[x] = 1;if (x == t)return flow;for (int i = now[x]; i != -1; i = e[i].nxt){now[x] = i;if (dis[e[i].to] == dis[x] + e[i].pri && e[i].val > 0){int val = dfs(e[i].to, min(e[i].val, flow));if (val > 0){e[i].val -= val;e[i ^ 1].val += val;ans += (long long) val * e[i].pri;return val;} }}return 0; }int main() {int T = 1;T = read();while (T --){int n, m, sum = 0;num = -1;n = read(); m = read();memset (head, -1, sizeof (head));for (int i = 1; i <= n; i ++){a[i] = read();sum += a[i];}for (int i = 1; i <= m; i ++){int u, v, w;u = read(); v = read(); w = read();addEdge(u, v, inf, w);addEdge(v, u, 0, -w);addEdge(v, u, inf, w);addEdge(u, v, 0, -w);}if (sum % n != 0){printf ("-1\n");continue;}sum /= n;int tot = 0;for (int i = 1; i <= n; i ++){a[i] -= sum;if (a[i] > 0){addEdge(0, i, a[i], 0);addEdge(i, 0, 0, 0);tot += a[i];}if (a[i] < 0){addEdge(i, n + 1, -a[i], 0);addEdge(n + 1, i, 0, 0);}}s = 0; t = n + 1;ans = 0; int val;while (spfa()){for (int i = 0; i <= t; i ++){vis[i] = 0;now[i] = head[i];}while (val = dfs(s, inf)){tot -= val;}}if (tot > 0){printf ("-1\n");continue;}printf ("%lld\n", ans);}return 0; } 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的21-5-22校赛G 自行车调度的全部內容,希望文章能夠幫你解決所遇到的問題。

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