【JZOJ】【匈牙利算法】【二分】 导弹
题意
有一张kkk*kkk的地图,地图上有kkk个城市,地图上的i,ji,ji,j表示第iii个城市到第jjj个城市的距离,地图上有两个国家,AAA&BBB,AAA国有nnn个城市,每个城市有一枚导弹,BBB国有mmm个城市,一枚导弹能摧毁一个BBB国的城市,求AAA国要多久才能摧毁整个BBB国
样例
输入
3
0 2 1
2 0 10
1 10 0
1
2
1
3
输出
3
样例解释
0 2 1
2 0 10
1 10 0
第二行第三列=10,表示编号为2(A2(A2(A国的城市)))的城市到编号为3(B3(B3(B国的城市)))的直接距离为101010,但这个距离并不是最优的,我们通过观察可以发现,从AAA国出发(编号为222的城市),先到编号为111的城市(用时为222),再从这个城市出发到BBB国城市,用时为111
所以摧毁BBB国最快的时间=2+1=3=2+1=3=2+1=3
所以样例答案为333
思路
首先通过Floyd求出最短路径,然后二分+最大匹配求出答案就OK了。
代码
#include<iostream>
#include<cstring>
#include<cstdio>using namespace std;int f[505][505];
int t, N, M, K, ans;
int h[105], used[105], link[105], A[105], B[105];struct node
{int to, next;
}w[5005];void add(int x, int y)
{w[++t] = (node){y, h[x]}; h[x] = t;}bool find(int x)
{for(int i = h[x]; i; i = w[i].next){int to = w[i].to;if (!used[to]){int p = link[to];link[to] = x;used[to] = 1;if (!p || find(p)) return 1;link[to] = p;}}return 0;
}bool check(int x)
{int sum = 0;t = 0;memset(w, 0, sizeof(w));memset(h, 0, sizeof(h));memset(link, 0, sizeof(link));for (int i = 1; i <= N; ++i)for (int j = 1; j <= M; ++j)if (f[A[i]][B[j]] <= x) add(i, j);for (int i = 1; i <= N; ++i) {memset(used, 0, sizeof(used));if (find(i)) sum++;}return sum == M;
}int main()
{memset(f, 0x7f, sizeof(f));scanf("%d", &K);for (int i = 1; i <= K; ++i)for (int j = 1; j <= K; ++j)scanf("%d", &f[i][j]);for (int i = 1; i <= K; ++i)for (int j = 1; j <= K; ++j)for (int k = 1; k <= K; ++k)f[i][j] = min(f[i][j], f[i][k] + f[k][j]);scanf("%d", &N);for (int i = 1; i <= N; ++i)scanf("%d", &A[i]);scanf("%d", &M);for (int i = 1; i <= M; ++i)scanf("%d", &B[i]);int l = 1, r = 1e6;while (l <= r){int mid = (l + r) / 2;if (check(mid)) r = mid - 1, ans = mid;else l = mid + 1;}printf("%d", ans);return 0;
}
【JZOJ】【匈牙利算法】【二分】 导弹相关推荐
- 【Floyed】【匈牙利算法】导弹(jzoj 1610)
题目大意: 有n个城市,有一部分是A国的,有一部分是B国的(小于A国的),A国每个城市都有一枚导弹(只有一枚),炸毁别的城市的时间是到这个城市的距离,请问A国最快要多久可以炸毁B国所有城市 解题思路: ...
- 利用匈牙利算法Hopcroft-Karp算法解决二分图中的最大二分匹配问题 例poj 1469 COURSES...
首先介绍一下题意:已知,有N个学生和P门课程,每个学生可以选0门,1门或者多门课程,要求在N个学生中选出P个学生使得这P个学生与P门课程一一对应. 这个问题既可以利用最大流算法解决也可以用匈牙利算法解 ...
- [ACM_图论] The Perfect Stall 完美的牛栏(匈牙利算法、最大二分匹配)
描述 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术.不幸的是,由于工程问题,每个牛栏都不一样.第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在她们 ...
- 【匈牙利算法】指引(jzoj 2319)
指引 jzoj 2319 题目大意: 在平面上有n个人和出口,一个出口只能让一个人进,每个人只能向右向上走,问最多让多少个人到出口 输入样例: 6 3 2 0 3 1 1 3 4 2 0 4 5 5 ...
- 二分匹配(匈牙利算法)
匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图最 ...
- 二分图带权最大匹配费用流_简单理解二分图与匈牙利算法
最近在看DETR等论文时时,看到了使用了二分图的最大匹配,对于没有计算机基础的我表示直接上来???,因此本篇博客主要介绍什么是二分图,以及二分图的匹配的匈牙利算法. 首先我们来看看二分图的定义: 二分 ...
- 二分最大匹配(匈牙利算法+HK算法)
http://acm.hdu.edu.cn/showproblem.php?pid=2063 匈牙利算法:http://blog.csdn.net/dark_scope/article/details ...
- 过山车 --- 二分匹配算法 匈牙利算法 记录
Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生 ...
- 判别两棵树是否相等 设计算法_从匈牙利算法到KM算法
网上搜了好多KM算法的文章,都写得云里雾里.看了半天之后,我终于看懂了.其实KM算法非常简单,只要会匈牙利算法了,一下就能看懂KM算法. 如果大家对自己的匈牙利算法不够自信的话,可以先复习一下,放上我 ...
- 51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题
题目: 题目已经说了是最大二分匹配题, 查了一下最大二分匹配题有两种解法, 匈牙利算法和网络流. 看了一下觉得匈牙利算法更好理解, 然后我照着小红书模板打了一遍就过了. 匈牙利算法:先试着把没用过的左 ...
最新文章
- Windows环境下配置环境变量
- 替换UI--遮挡问题
- fileviewpro绿色免安装版
- 【设计模式】C++单例模式
- python 下载拉钩教育AES加密视频
- 前端学习(2810):完成安卓打包
- 阿里云容器服务发布 Knative 托管服务
- MyEclipse中使用Proxool+mysql连接池的方法
- 20-21-2网络管理quiz6
- Google FlatBuffers——开源、跨平台的新一代序列化工具
- N35-第十四周作业
- 拓端tecdat|R语言中的copula GARCH模型拟合时间序列并模拟分析
- docker-compose简单使用
- php酒店系统论文,PHP酒店网站管理系统毕业论文
- 计算机密码无法输完整,笔记本电脑键盘失灵无法输入密码怎么解决
- I5 4590 台式机安装黑苹果最新版笔记
- 前端UI设计稿对比工具
- 面试题,移动端APP测试常见bug记录
- workbench3.2学习笔记三
- 烈焰遮天mysql密码_完美运营版悬赏任务积分墙源码