2017多校第9场 HDU 6166 Senior Pan 堆优化Dij
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6166
题意:给你一个有向图,然后给你k个点,求其中一个点到另一个点的距离的最小值。
解法:枚举二进制位按照标号当前位为1 和当前位为0分为两个集合,每次求解两个集合之间的最短路即可覆盖到所有的点对。时间复杂度20*dijstla时间,这样做的正确性在哪?显然我们需要的答案至少有一个二进制位不同,那么这样求解肯定可以找到正确答案,事实上还可以随机分组emmmm。。。
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long LL;
- const int maxn = 100010;
- const LL inf = 0x3f3f3f3f3f3f3f3f;
- struct edge{
- int to,val,next;
- }E[maxn];
- int head[maxn],edgecnt,a[maxn];
- bool vis[maxn];
- LL dis[maxn];
- void initedge(){
- edgecnt=0;
- memset(head,-1,sizeof(head));
- }
- void add(int u, int v, int w){
- E[edgecnt].to=v,E[edgecnt].val=w,E[edgecnt].next=head[u],head[u]=edgecnt++;
- }
- struct node{
- int x;
- LL step;
- node(int x, LL step):x(x),step(step){}
- bool operator < (const node &rhs) const{
- return step>rhs.step;
- }
- };
- priority_queue<node>q;
- LL Dijstra(){
- while(!q.empty()){
- node now=q.top(); q.pop();
- if(vis[now.x]) return now.step;
- int u=now.x;
- for(int i=head[u]; ~i; i=E[i].next){
- int to = E[i].to;
- if(dis[to]>dis[u]+E[i].val){
- dis[to]=dis[u]+E[i].val;
- q.push(node(to,dis[to]));
- }
- }
- }
- return inf;
- }
- void init(){
- memset(vis, 0, sizeof(vis));
- for(int i=0; i<maxn; i++) dis[i]=inf;
- while(!q.empty()) q.pop();
- }
- LL work(int k)
- {
- LL ans = inf;
- for(int i=0; i<20; i++){
- init();
- for(int j=1; j<=k; j++){
- if(a[j]&(1<<i)){
- q.push(node(a[j],0)),dis[a[j]]=0;
- }
- else{
- vis[a[j]]=1;
- }
- }
- ans = min(ans, Dijstra());
- init();
- for(int j=1; j<=k; j++){
- if(a[j]&(1<<i)){
- vis[a[j]]=1;
- }
- else{
- q.push(node(a[j],0)),dis[a[j]]=0;
- }
- }
- ans = min(ans, Dijstra());
- }
- return ans;
- }
- int T,n,m,k,ks;
- int main()
- {
- ks = 0;
- scanf("%d", &T);
- while(T--)
- {
- initedge();
- scanf("%d %d",&n,&m);
- for(int i=1; i<=m; i++){
- int u, v, w;
- scanf("%d %d %d", &u,&v,&w);
- add(u, v, w);
- }
- scanf("%d", &k);
- for(int i=1; i<=k; i++) scanf("%d", &a[i]);
- LL ans = work(k);
- printf("Case #%d: %lld\n", ++ks, ans);
- }
- return 0;
- }
2017多校第9场 HDU 6166 Senior Pan 堆优化Dij的更多相关文章
- 2017多校第9场 HDU 6169 Senior PanⅡ 数论,DP,爆搜
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6169 题意:给了区间L,R,求[L,R]区间所有满足其最小质数因子为k的数的和. 解法: 我看了这篇b ...
- HDU 6166.Senior Pan()-最短路(Dijkstra添加超源点、超汇点)+二进制划分集合 (2017 Multi-University Training Contest - Team 9 1006)
学长好久之前讲的,本来好久好久之前就要写题解的,一直都没写,懒死_(:з」∠)_ Senior Pan Time Limit: 12000/6000 MS (Java/Others) Memor ...
- HDU 6166 Senior Pan (最短路变形)
题目链接 Problem Description Senior Pan fails in his discrete math exam again. So he asks Master ZKC to ...
- 2017多校第9场 HDU 6170 Two strings DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6170 题意:给了2个字符串,其中第2个字符串包含.和*两种特别字符,问第二个字符串能否和第一个匹配. ...
- 2017多校第9场 HDU 6161 Big binary tree 思维,类似字典树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6161 题意: 题目是给一棵完全二叉树,从上到下从左到右给每个节点标号,每个点有权值,初始权值为其标号, ...
- 2017多校第10场 HDU 6181 Two Paths 次短路
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6181 题意:给一个图,求出次短路. 解法:我之前的模板不能解决这种图,就是最短路和次短路相等的情况,证 ...
- 2017多校第10场 HDU 6180 Schedule 贪心,multiset
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6180 题意:给了一些任务的开始时间和终止时间,现在让我们安排k台及机器,让这些任务在k太机器上最小,并 ...
- 2017多校第10场 HDU 6178 Monkeys 贪心,或者DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6178 题意:给出一棵有n个节点的树,现在需要你把k只猴子放在节点上,每个节点最多放一只猴子,且要求每只 ...
- 2017多校第10场 HDU 6171 Admiral 双向BFS或者A*搜索
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6171 题意: 给你一个高度为6的塔形数组,你每次只能将0与他上下相邻的某个数交换,问最少交换多少次可以 ...
随机推荐
- 编译 python 生成静态库 libpython2.7.so
由于我们是C++作驱动的Python开发,驱动需要加上Python静态库libpython2.7.so.libpython2.7.so.1.0.libpython2.7.a.此处我想在python源码 ...
- hdu 1115 Lifting the Stone (数学几何)
Lifting the Stone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- 【题解】Atcoder ARC#85 E-MUL
……没啥可说的.最大权闭合子图,跑下dinic就好了…… #include <bits/stdc++.h> using namespace std; #define maxn 500000 ...
- 【题解】CF#852 E-Casinos and travel
天啊我怎么这么蠢……写了一个树形dp,的确发现记录的很多值并没有什么用,然而当时脑子没转过弯来还是写了这个树形dp……虽然能A但就不解释了,总之是个垃圾算法(ー̀дー́) #include <b ...
- HDU2089:不要62——题解
http://acm.hdu.edu.cn/showproblem.php?pid=2089 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管 ...
- 爆款PHP面试题
$a = 3; $b = 6; if ($a = 4 || $b = 4) { $a++; $b++; } echo $a; //输出 1 echo $b; //输出 7 逛鸟哥博客,看评论区有个新手 ...
- group by多字段分组
在平时的开发任务中我们经常会用到MYSQL的GROUP BY分组, 用来获取数据表中以分组字段为依据的统计数据.比如有一个学生选课表,表结构如下: Table: Subject_Selection S ...
- 再来说一说sudo
app ALL = (ALL:ALL) ALL eric.zhan ALL = (app : app) ALLDefaults:eric.zhan runas_default=app 如 ...
- 团队题目需求分析-NABCD
Need: 由本人亲身体验出发,觉得很多同学记不住老师留的作业,或者上课时间记录了,但是老是忘记到底记录了什么,导致没有半大写作业,所以准备设计一个东西来帮助同学. A: 首先,我最先想到的是手机,所 ...
- devDependencies 和 dependencise 的区别
在使用 npm install 安装模块或者插件的时候,在命令中可以添加俩种参数把他们写入到 pakeage.json 文件里面去: --save ( 简写 -S ) --save-dev ( 简写 ...