题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3035

题意

给个图,求把s和t分开的最小割。

分析

实际顶点和边非常多,不能用最大流来求解。这道题要用平面图求最小割的方法:

把面变成顶点,对每两个面相邻的边作一条新边。然后求最短路就是最小割了。

另外,外平面分成两个点,分别是源点和汇点,源点连左下的边,汇点连右上的边,这样跑出来才是正确的。

建图参考自:https://blog.csdn.net/accelerator_/article/details/40957675

#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std; const int MAXNODE = ;
const int MAXEDGE = * MAXNODE; typedef int Type;
const Type INF = 0x3f3f3f3f; struct Edge {
int u, v;
Type dist;
Edge() {}
Edge(int u, int v, Type dist) {
this->u = u;
this->v = v;
this->dist = dist;
}
}; struct HeapNode {
Type d;
int u;
HeapNode() {}
HeapNode(Type d, int u) {
this->d = d;
this->u = u;
}
bool operator < (const HeapNode& c) const {
return d > c.d;
}
}; struct Dijkstra {
int n, m;
Edge edges[MAXEDGE];
int first[MAXNODE];
int next[MAXEDGE];
bool done[MAXNODE];
Type d[MAXNODE]; void init(int n) {
this->n = n;
memset(first, -, sizeof(first));
m = ;
} void add_Edge(int u, int v, Type dist) {
edges[m] = Edge(u, v, dist);
next[m] = first[u];
first[u] = m++;
} Type dijkstra(int s, int t) {
priority_queue<HeapNode> Q;
for (int i = ; i < n; i++) d[i] = INF;
d[s] = ;
memset(done, false, sizeof(done));
Q.push(HeapNode(, s));
while (!Q.empty()) {
HeapNode x = Q.top(); Q.pop();
int u = x.u;
if (done[u]) continue;
done[u] = true;
for (int i = first[u]; i != -; i = next[i]) {
Edge& e = edges[i];
if (d[e.v] > d[u] + e.dist) {
d[e.v] = d[u] + e.dist;
Q.push(HeapNode(d[e.v], e.v));
}
}
}
return d[t];
}
} gao; typedef long long ll; int n, m; int main() {
while (~scanf("%d%d", &n, &m)) {
int u, v, w;
gao.init(n * m * + );
int s = n * m * , t = n * m * + ;
for (int i = ; i < (n + ); i++) {
for (int j = ; j < m; j++) {
scanf("%d", &w);
u = (i - ) * m + j + n * m;
v = i * m + j;
if (i == ) u = t;
if (i == n) v = s;
gao.add_Edge(u, v, w);
gao.add_Edge(v, u, w);
}
}
for (int i = ; i < n; i++) {
for (int j = ; j < (m + ); j++) {
scanf("%d", &w);
u = n * m * + i * m + j - ;
v = n * m * + i * m + j;
if (j == ) u = s;
if (j == m) v = t;
gao.add_Edge(u, v, w);
gao.add_Edge(v, u, w);
}
}
for (int i = ; i < n; i++) {
for (int j = ; j < m; j++) {
scanf("%d", &w);
u = i * m + j;
v = n * m * + i * m + j;
gao.add_Edge(u, v, w);
gao.add_Edge(v, u, w);
scanf("%d", &w);
v += n * m;
gao.add_Edge(u, v, w);
gao.add_Edge(v, u, w);
}
for (int j = ; j < m; j++) {
scanf("%d", &w);
u = n * m + i * m + j;
v = n * m * + i * m + j;
gao.add_Edge(u, v, w);
gao.add_Edge(v, u, w);
scanf("%d", &w);
v += n * m;
gao.add_Edge(u, v, w);
gao.add_Edge(v, u, w);
}
}
printf("%d\n", gao.dijkstra(s, t));
}
return ;
}

HDU - 3035 War(对偶图求最小割+最短路)的更多相关文章

  1. BZOJ_1001_狼抓兔子_(平面图求最小割+对偶图求最短路)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec   ...

  2. HDU 4289:Control(最小割)

    http://acm.hdu.edu.cn/showproblem.php?pid=4289 题意:有n个城市,m条无向边,小偷要从s点开始逃到d点,在每个城市安放监控的花费是sa[i],问最小花费可 ...

  3. HDU 6214 Smallest Minimum Cut 最小割,权值编码

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6214 题意:求边数最小的割. 解法: 建边的时候每条边权 w = w * (E + 1) + 1; 这 ...

  4. poj 3469 Dual Core CPU【求最小割容量】

    Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 21453   Accepted: 9297 ...

  5. [ZJOI2011]最小割 & [CQOI2016]不同的最小割 分治求最小割

    题面: [ZJOI2011]最小割 [CQOI2016]不同的最小割 题解: 其实这两道是同一道题.... 最小割是用的dinic,不同的最小割是用的isap 其实都是分治求最小割 简单讲讲思路吧 就 ...

  6. HDU 3657 Game(取数 最小割)经典

    Game Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. sw算法求最小割学习

    http://  blog.sina.com.cn/s/blog_700906660100v7vb.html 转载:http://www.cnblogs.com/ylfdrib/archive/201 ...

  8. HDU 2435 There is a war (网络流-最小割)

    There is a war Problem Description       There is a sea.       There are N islands in the sea.       ...

  9. HDU 5889 Barricade 【BFS+最小割 网络流】(2016 ACM/ICPC Asia Regional Qingdao Online)

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

随机推荐

  1. Python3 小技巧

    完全个人总接 每个文件头部都可以加入这个,或者放到用单独一个文件,再import *.其实都一样,只需要一行false=False;true=True;none=null=None;hid=lambd ...

  2. TTL与非门电路分析

    TTL与非门(TTL推挽式与非门)是TTL集成逻辑门的一种,主要由三极管和二极管构成.如图(a)所示,它由输入级,中间级,输出级三部分组成.TTL与非门的优点在于输出阻抗低,带负载能力强,工作速度快. ...

  3. 关于ORACLE数据库名以及数据实例名等几个重要概念

    在Oracle中有关数据库和数据库实例的几个重要概念,有时候如果理解不是很深或者对其疏忽.混淆了,还真容易搞错或弄不清其概念,下面就数据库实例名.数据库名.数据库域名.数据库服务名.全局数据库名几个概 ...

  4. SQL高级查询基础

    1.UNION,EXCEPT,INTERSECT运算符 A,UNION 运算符 UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表. ...

  5. Linux学习历程——Centos 7 chown命令

    一.命令介绍 Linux是多人多工操作系统,所有的文件皆有拥有者.利用 chown 将指定文件的拥有者改为指定的用户或组, 用户可以是用户名或者用户ID:组可以是组名或者组ID:文件是以空格分开的要改 ...

  6. Python 爬虫 之 阅读呼叫转移(一)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/jcjc918/article/details/37533073     你是否苦恼于网上无法下载的& ...

  7. 转://oracle 软件的收费模式

    Oracle软件本身是免费的,所以任何人都可以从Oracle官方网站下载并安装Oracle的数据库软件,收费的是License,即软件授权,如果数据库用于商业用途,就需要购买相应Oracle产品的Li ...

  8. JProfiler的详细使用介绍

    转:https://blog.csdn.net/huangjin0507/article/details/52452946 下载软件 官网地址:http://www.ej-technologies.c ...

  9. 江苏省选2019Round2游记

    JSOI2019R2过去了. 翻盘变翻车... Day 0 打板子.写了几棵主席树. 然后啃CF 331D3.啃不动 Day 1 开T1.这什么玩意啊...换换换 开T2.一眼\(10\)分的状压,码 ...

  10. 随心测试_软测基础_005 <测试人员工作内容>

    接上篇:清楚了_测试人员的工作职责范围,那每项 测试活动的具体工作内容有哪些呢? Q1:如何理解测试工程师的工作内容? A1:SX的观点:综合一体化 现如今互联网行业如何哪达,每一项IT职业的工作职责 ...