HDU - 3046 Pleasant sheep and big big wolf(最小割)
来源:互联网 发布:java培训机构排名 编辑:程序博客网 时间:2024/05/16 07:40
题目大意:给出一张地图,地图上面的0表示空地,1表示羊,2表示狼,现在要求你建围栏,使得所有的羊都不会被狼攻击,问至少需要建多少个围栏
解题思路:最小割,狼和羊之间的联系就是s–>u….->v–>t(u表示狼,v表示羊),我们要做的就是断开这样的线路,且付出的代价最小,这就是最小割了
狼和源点相连接,容量为INF,羊和汇点相连接,容量为INF(刚开始弄成1了,1的话,就表示1头羊只能被一头狼攻击,这明显是错的),两个格子之间连边,表示围栏,容量为1
#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <queue>using namespace std;const int MAXNODE = 40010;const int MAXEDGE = 400010;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); } }}dinic;int n, m, cas = 1;int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};void solve() { int source = 0, sink = n * m + 1; dinic.init(sink + 1); int t; for (int i = 0; i < n; i++) for (int j = 1; j <= m; j++) { scanf("%d", &t); if (t == 1) dinic.AddEdge(i * m + j, sink, INF); if (t == 2) dinic.AddEdge(source, i * m + j, INF); } int tx, ty; for (int i = 0; i < n; i++) for (int j = 1; j <= m; j++) for (int k = 0; k < 4; k++) { tx = i + dir[k][0]; ty = j + dir[k][1]; if (tx < 0 || tx >= n || ty < 1 || ty > m) continue; dinic.AddEdge(i * m + j, tx * m + ty, 1); } printf("Case %d:\n%d\n", cas++, dinic.Maxflow(source, sink));}int main() { while (scanf("%d%d", &n, &m) != EOF) solve(); return 0;}
0 0
- hdu 3046 Pleasant sheep and big big wolf //最小割
- hdu 3046 Pleasant sheep and big big wolf (最小割)
- hdu 3046 Pleasant sheep and big big wolf(最小割)
- HDU 3046 Pleasant sheep and big big wolf 最小割
- HDU 3046 Pleasant sheep and big big wolf | 最小割
- hdu 3046 Pleasant sheep and big big wolf 最小割
- Pleasant sheep and big big wolf (hdu 3046 最小割)
- HDU - 3046 Pleasant sheep and big big wolf(最小割)
- hdu 3046 Pleasant sheep and big big wolf(最小割)
- hdoj 3046 Pleasant sheep and big big wolf 【最小割】
- HDU 3046 Pleasant sheep and big big wolf 最小割==最大流(喜羊羊)
- hdu 3046 Pleasant sheep and big big wolf(最小割)
- HDU 3046Pleasant sheep and big big wolf(网络流之最小割)
- HDU 3046 Pleasant sheep and big big wolf(最小割)
- HDU 3046-Pleasant sheep and big big wolf(网络流_最小割)
- HDU 3046 Pleasant sheep and big big wolf(最小割)
- HDU 3046 Pleasant sheep and big big wolf(最小割-Dinic)
- hdu 3046 Pleasant sheep and big big wolf(最小割)
- Java性能优化(11):考虑实现Comparable接口
- Opencv中的几种边缘检测算法
- LightOJ 1370-Bi-shoe and Phi-shoe(欧拉函数)
- 【Github教程】史上最全github使用方法:github入门到精通
- domino解决删除用户后还存在邮件数据库问题
- HDU - 3046 Pleasant sheep and big big wolf(最小割)
- hdu5327 Olympiad(数组前缀和+set判重)
- 网络分析软件和linux下网络性能测试软件iperf
- Spring依赖注入(DI)
- easyUI数据统计列表中根据单元格数值控制显示效果
- 【原】个人java项目经验总结
- 推荐!手把手教你使用Git
- UVA 10881 Piotr's Ants
- 排序专项练习