HDU - 3157 Crazy Circuits(有下界的最小流)
2015-09-06 22:46
295 查看
题目大意:一个电路板,上面有N个接线柱,还有+,-两极
现在给出M条线路,每条线路都有相应的下限,即需要流至少多少的电流才能使该线路运行
问需要通多少的电流,才能使得所有的线路都能运行
解题思路:有下界的最小流,这个百度一下可以搜到,具体就不解释了
这边解释一下为什么先跑一下最大流,再添加边,再跑一下最大流
在没有添加边的情况下,先跑最大流,即保证能平衡的先尽量平衡,这样就可以减少后面的流量了
接着再添加边再跑最大流,既是为了确保平衡
现在给出M条线路,每条线路都有相应的下限,即需要流至少多少的电流才能使该线路运行
问需要通多少的电流,才能使得所有的线路都能运行
解题思路:有下界的最小流,这个百度一下可以搜到,具体就不解释了
这边解释一下为什么先跑一下最大流,再添加边,再跑一下最大流
在没有添加边的情况下,先跑最大流,即保证能平衡的先尽量平衡,这样就可以减少后面的流量了
接着再添加边再跑最大流,既是为了确保平衡
[code]#include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue> using namespace std; const int MAXNODE = 210; const int MAXEDGE = 100010; typedef int Type; const Type INF = 0x3f3f3f3f; struct Edge{ int u, v, next; Type cap, flow; Edge() {} Edge(int u, int v, Type cap, Type flow, int next) : u(u), v(v), cap(cap), flow(flow), next(next){} }; struct Dinic{ int n, m, s, t; Edge edges[MAXEDGE]; int head[MAXNODE]; int cur[MAXNODE]; bool vis[MAXNODE]; Type d[MAXNODE]; vector<int> cut; void init(int n) { this->n = n; memset(head, -1, sizeof(head)); m = 0; } void AddEdge(int u, int v, Type cap) { edges[m] = Edge(u, v, cap, 0, head[u]); head[u] = m++; edges[m] = Edge(v, u, 0, 0, head[v]); head[v] = m++; } bool BFS() { memset(vis, 0, sizeof(vis)); queue<int> Q; Q.push(s); d[s] = 0; vis[s] = 1; while (!Q.empty()) { int u = Q.front(); Q.pop(); for (int i = head[u]; ~i; i = edges[i].next) { Edge &e = edges[i]; if (!vis[e.v] && e.cap > e.flow) { vis[e.v] = true; d[e.v] = d[u] + 1; Q.push(e.v); } } } return vis[t]; } Type DFS(int u, Type a) { if (u == t || a == 0) return a; Type flow = 0, f; for (int &i = cur[u]; i != -1; i = edges[i].next) { Edge &e = edges[i]; if (d[u] + 1 == d[e.v] && (f = DFS(e.v, min(a, e.cap - e.flow))) > 0) { e.flow += f; edges[i ^ 1].flow -= f; flow += f; a -= f; if (a == 0) break; } } return flow; } Type Maxflow(int s, int t) { this->s = s; this->t = t; Type flow = 0; while (BFS()) { for (int i = 0; i < n; i++) cur[i] = head[i]; flow += DFS(s, INF); } return flow; } void Mincut() { cut.clear(); for (int i = 0; i < m; i += 2) { if (vis[edges[i].u] && !vis[edges[i].v]) cut.push_back(i); } } bool judge() { for (int i = head[s]; ~i; i = edges[i].next) if (edges[i].cap - edges[i].flow != 0) return false; return true; } }dinic; #define maxn 60 int n, m; int d[maxn]; char str[maxn]; void init() { memset(d, 0, sizeof(d)); int source = n + 2, sink = n + 3; dinic.init(sink + 1); int u, v, c; for (int i = 1; i <= m; i++) { scanf("%s", str); if (str[0] == '+') u = 0; else sscanf(str, "%d", &u); scanf("%s", str); if (str[0] == '-') v = n + 1; else sscanf(str, "%d", &v); scanf("%d", &c); dinic.AddEdge(u, v, INF); d[u] -= c; d[v] += c; } for (int i = 0; i <= n + 1; i++) { if (d[i] > 0) dinic.AddEdge(source, i, d[i]); if (d[i] < 0) dinic.AddEdge(i, sink, -d[i]); } dinic.Maxflow(source, sink); dinic.AddEdge(n + 1, 0, INF); dinic.Maxflow(source, sink); if (!dinic.judge()) printf("impossible\n"); else printf("%d\n", dinic.edges[dinic.m - 2].flow); } int main() { while (scanf("%d%d", &n, &m) != EOF && n + m) { init(); } return 0; }
相关文章推荐
- UE
- hdoj 1159 Common Subsequence 【LCS】
- require.resolve函数
- UIFont相关
- 手势 各大集锦 UI iOS
- zoj3792 Romantic Value 最大流<->最小割
- [NSNull intValue]: unrecognized selector sent to instance 0x375c9860
- UIMenuController的使用,对UILabel拷贝以及定制菜单
- mantis中issue的状态和解决转台说明
- iOS——UIImageView的使用方法详细
- UIView属性
- UITextView
- UITextField属性
- UITableView
- UISlide属性
- UISegment属性
- UIScrollView
- UIPageControl
- UILabel属性
- UIImageView属性