HDU 5889【最小割+最短路】
阿新 • • 發佈:2018-04-29
ID 要求 當前 置1 優化 AC return pri string
題意:給出一張n個點m條邊的無向圖,邊權均為1,敵人在n點準備走最短路在攻擊己方位置1點,現在要在一些邊上設置一些路障,給出每條邊設置路障的代價,要求用最少的代價設置路障使得敵人必然遇到路障。
這份代碼了用到了當前弧優化,盡管我不是很懂。。。
但素不用的話會超時!
#include<stdio.h> #include<string.h> #include<queue> using namespace std; struct node { int from; int to; int w; int next; }e[160000]; int cur[1500]; int head[1500]; int divv[1500]; int cont, ss, tt; void add(int from, int to, int w) { e[cont].from = from; e[cont].w = w; e[cont].to = to; e[cont].next = head[from]; head[from] = cont++; } int n, m; int makedivv() { memset(divv, 0, sizeof(divv)); divv[ss] = 1; queue<int >s; s.push(ss); while (!s.empty()) { int u = s.front(); if (u == tt)return 1; s.pop(); for (int i = head[u]; i != -1; i = e[i].next) { int w = e[i].w; int v = e[i].to; if (divv[v] == 0 && w) { divv[v] = divv[u] + 1; s.push(v); } } } return 0; } int Dfs(int u, int maxflow, int tt) { if (u == tt)return maxflow; int ret = 0; //當前弧優化 for (int &i = cur[u]; i != -1; i = e[i].next) { int v = e[i].to; int w = e[i].w; if (divv[v] == divv[u] + 1 && w) { int f = Dfs(v, min(maxflow - ret, w), tt); e[i].w -= f; e[i ^ 1].w += f; ret += f; if (ret == maxflow)return ret; } } return ret; } void Dinic() { long long int ans = 0; while (makedivv() == 1) { memcpy(cur, head, sizeof(head)); ans += Dfs(ss, 0x3f3f3f3f, tt); } printf("%lld\n", ans % 100000); } int main() { int t; scanf("%d", &t); while (t--) { scanf("%d%d", &n, &m); scanf("%d%d", &ss, &tt); cont = 0; memset(head, -1, sizeof(head)); for (int i = 0; i < m; i++) { int x, y, z; scanf("%d%d%d", &x, &y, &z); add(x, y, z); add(y, x, 0); } Dinic(); } }
HDU 5889【最小割+最短路】