题目链接: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. 1 minute教会你shell

    Shell模板 #!/bin/bash ####################################################### # $Name: shell_template. ...

  2. python内存回收的问题

    python实际上,对于占用很大内存的对象,并不会马上释放. 举例,a=range(10000*10000),会发现内存飙升一个多G,del a 或者a=[]都不能将内存降下来.. del 可以删除多 ...

  3. 如何学好java

    今天发现这么一篇文章,对于笔者谈的:"一方面很努力学习,一方面又觉得不踏实",我感同身受.觉得文章写得不错,在此献给一些在java中努力的朋友们,希望能有所收获. 文章原内容: 近 ...

  4. Webdriver之API详解(2)

    前言:今天继续上一篇文章https://www.cnblogs.com/linuxchao/p/linuxchao-selenium-apione.html分享selenium' webdriver ...

  5. 「技巧」如何快速安装 Sketch 插件

    Sketch拥有强大丰富的插件,但是这些插件天各一方,四处查找下载地址非常麻烦.这里提供一个技巧,通过一个入口可以安装各种插件,基本涵盖了市面上所有靠谱的插件. 准备 Sketch54 Runner ...

  6. mongoTemplate查询大数据过慢

    先上两段代码 代码一 Query query = new Query();queryAfter.addCriteria(Criteria.where("id").in(idList ...

  7. 小小知识点(八)——星座图与PSK、QAM调制的关系

    星座图是对PSK和QAM调制相位和幅度的一种表示,让我们只关注被调制参量本身,而不管已调信号波形及其频率. 在信号传输仿真时也一样,我们只关注携带信息的幅值和相位,而不管信号的传输波形和频率.这就是为 ...

  8. 验证码的实现py3

    import randomflag = 1try_=0while (flag): try_ +=1 yan = "" for i in range(0,4): cun=random ...

  9. 深度学习识别CIFAR10:pytorch训练LeNet、AlexNet、VGG19实现及比较(一)

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 前面几篇文章介绍了MINIST,对这种简单图片的识别,LeNet-5可以达到99%的识别率. CIFA ...

  10. MessageDigest类

    public abstract class MessageDigest extends MessageDigestSpi API中的中英文对照简介(未完) java.security.MessageD ...