原图的面转成点,原图的边依旧边,只是连接的是两个面.

对偶图的点数=原图的面数 对偶图的边数=原图的边数(如果原边只属于一个面,则它为环边)

#include<bits/stdc++.h>
using namespace std;
const int MAXN = , MAXM = ;
int mindist[MAXN];
bool vis[MAXN];
int to[MAXM << ], nxt[MAXM << ], Head[MAXN], ed = ;
int cost[MAXM << ];
inline void addedge(int u, int v, int c) {
to[++ed] = v;
nxt[ed] = Head[u];
cost[ed] = c;
Head[u] = ed;
to[++ed] = u;
nxt[ed] = Head[v];
cost[ed] = c;
Head[v] = ed;
}
inline void read(int &v) {
v = ;
char c = ;
int p = ;
while (c < '' || c > '') {
if (c == '-') {
p = -;
}
c = getchar();
}
while (c >= '' && c <= '') {
v = (v << ) + (v << ) + c - '';
c = getchar();
}
v *= p;
}
struct HeapNode {
int d, u;
bool operator < (const HeapNode& rhs) const {
return d > rhs.d;
}
} zz;
priority_queue<HeapNode> que;
void Hijkstra(int s) {
mindist[s] = ;
memset(vis, , sizeof(vis));
zz.d = , zz.u = s;
que.push(zz);
while (!que.empty()) {
HeapNode x = que.top();
que.pop();
int u = x.u;
if (vis[u] || mindist[u] != x.d) {
continue;
}
vis[u] = true;
for (int v, i = Head[u]; i; i = nxt[i]) {
v = to[i];
if (mindist[v] > mindist[u] + cost[i]) {
mindist[v] = mindist[u] + cost[i];
//p[v]=u;
zz.d = mindist[v], zz.u = v;
que.push(zz);
}
}
}
}
int n, m;
int getnum(int x, int y, int add) {
return (x - ) * (m - ) * + (y - ) * + add;
}
int main() {
int u, v, c;
read(n), read(m);
int sum = (n - ) * (m - ) * + ;
if (n == || m == ) {
int ans = INT_MAX;
if (n == ) {
for (int i = ; i < m; i++) {
read(c);
ans = min(ans, c);
}
} else {
for (int i = ; i < n; i++) {
read(c);
ans = min(ans, c);
}
}
printf("%d\n", ans);
return ;
}
for (int i = ; i <= n; i++) {
for (int j = ; j <= m - ; j++) {
read(c);
if (i == ) {
addedge(sum, getnum(i, j, ), c);
} else if (i == n) {
addedge(sum - , getnum(i - , j, ), c);
} else {
addedge(getnum(i, j, ), getnum(i - , j, ), c);
}
}
}
for (int i = ; i <= n - ; i++) {
for (int j = ; j <= m; j++) {
read(c);
if (j == ) {
addedge(sum - , getnum(i, j, ), c);
} else if (j == m) {
addedge(sum, getnum(i, j - , ), c);
} else {
addedge(getnum(i, j, ), getnum(i, j - , ), c);
}
}
}
for (int i = ; i <= n - ; i++) {
for (int j = ; j <= m - ; j++) {
read(c);
addedge(getnum(i, j, ), getnum(i, j, ), c);
}
}
for (int i = ; i <= sum + ; i++) {
mindist[i] = 1e9;
}
Hijkstra(sum - );
printf("%d\n", mindist[sum]);
}

BZOJ 1001 平面图转对偶图的更多相关文章

  1. bzoj 1001 平面图转对偶图 最短路求图最小割

    原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1001 整理了下之前A的题 平面图可以转化成对偶图,然后(NlogN)的可以求出图的最小割( ...

  2. BZOJ 1001 平面图与对偶图的转化 最短路Or最大流

    思路: 1.按照题意求最小割 转换成最大流用Dinic解 2. 转换成对偶图 求最短路 Dinic: //By SiriusRen #include <queue> #include &l ...

  3. BZOJ 1001 [BeiJing2006] 狼抓兔子(平面图最大流)

    题目大意 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的.而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...

  4. s - t 平面图最大流 (附例题 bzoj 1001)

    以下均移自 周冬的<两极相通-浅析最大最小定理在信息学竞赛中的应用> 平面图性质 1.(欧拉公式)如果一个连通的平面图有n个点,m条边和f个面,那么f=m-n+2 2.每个平面图G都有一个 ...

  5. 【BZOJ 2007】 2007: [Noi2010]海拔 (平面图转对偶图+spfa)

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2504  Solved: 1195 Description YT市 ...

  6. 【BZOJ】2007: [Noi2010]海拔(平面图转对偶图)

    题目 传送门:QWQ 分析 左上角是0,右下角是1.那么大概整张图是由0 1构成的. 那么我们要找到0和1的分界线,值就是最小割. 然后变成求原图最小割. 考虑到此题是平面图,那么就转成对偶图跑最短路 ...

  7. bzoj 1001 狼抓兔子 —— 平面图最小割(最短路)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 平面图最小割可以转化成最短路问题: 建图时看清楚题目的 input ... 代码如下: ...

  8. BZOJ 4541: [Hnoi2016]矿区 平面图转对偶图+DFS树

    4541: [Hnoi2016]矿区 Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 433  Solved: 182[Submit][Status][ ...

  9. BZOJ 4423: [AMPPZ2013]Bytehattan 并查集+平面图转对偶图

    4423: [AMPPZ2013]Bytehattan Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 277  Solved: 183 [Submit ...

随机推荐

  1. 解读GitHub EntityComponentSystemSamples

    出自Unity官方的ECS项目示例,该项目的第一次Commit是在2018年3月20号,距离现在一年半的时间,这期间ECS本身的生态在快速发展,稳定性也是逐步提升,期待在2020年的Unity版本中作 ...

  2. CTF中对web服务器各种提权姿势

    在我们拿下服务器web服务往往只是低权限用户,对于内网渗透,我们往往需要root权限,Linux系统提权包括使用溢出漏洞已及利用系统配置文件. 提权前提: 1.拿到低权限shell 2.被入侵机器上有 ...

  3. 调用存储在session属性里的东西

    将对象放在session里面 request.getSession().setAttribute("username", username); //放到会话里 永EL表达式调用 $ ...

  4. golang break label 与goto label

    本文链接:https://blog.csdn.net/itbsl/article/details/73380537 与其他语言一样,Go语言也支持label(标签)语法:分别是break label和 ...

  5. git pull因为主线分支问题解决

    方法1:如果你想保留刚才本地修改的代码,并把git服务器上的代码pull到本地(本地刚才修改的代码将会被暂时封存起来) git stashgit pull origin mastergit stash ...

  6. OpenCV_复制一个或多个ROI图像区域

    在对图像进行处理过程中,我们经常需要对图像的某个或多个感兴趣区域进行处理.在OpenCV中我们能够非常方便地获取指定ROI区域的子图像.下面这段代码就演示了怎样获取指定单个ROI或多个ROI图像区域. ...

  7. 选择排序的Python代码实现

    对于a[0]~a[n]的数组, 默认a[i]最小,和后面的a[i+1]~a[n]进行比较,把最小的和a[i]交换位置,保证本次循环结束后a[i]是上一次未排序的数据中最小的 写法1 a=[12,2,2 ...

  8. PTA(Advanced Level)1083.List Grades

    Given a list of N student records with name, ID and grade. You are supposed to sort the records with ...

  9. Vue.js学习笔记-script标签在head和body的区别

    初学JavaScript,项目需要没有系统学习,只能边查资料边码代码,埋下的坑不知道有多少,还是建议时间充足的情况下系统的将Javascript学习一遍 ,涉及的HTML知识也务必了解. 问题 最开始 ...

  10. Swoft2.x 小白学习笔记 (三) --- Task、协程

    介绍swoft中 1.Task 2.协程 一:Task任务: 1.配置,在 app/bean.php文件中加入 'httpServer' => [ // ... 'on' => [ Swo ...