题目链接: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的更多相关文章

  1. 2017多校第9场 HDU 6169 Senior PanⅡ 数论,DP,爆搜

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6169 题意:给了区间L,R,求[L,R]区间所有满足其最小质数因子为k的数的和. 解法: 我看了这篇b ...

  2. HDU 6166.Senior Pan()-最短路(Dijkstra添加超源点、超汇点)+二进制划分集合 (2017 Multi-University Training Contest - Team 9 1006)

    学长好久之前讲的,本来好久好久之前就要写题解的,一直都没写,懒死_(:з」∠)_ Senior Pan Time Limit: 12000/6000 MS (Java/Others)    Memor ...

  3. HDU 6166 Senior Pan (最短路变形)

    题目链接 Problem Description Senior Pan fails in his discrete math exam again. So he asks Master ZKC to ...

  4. 2017多校第9场 HDU 6170 Two strings DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6170 题意:给了2个字符串,其中第2个字符串包含.和*两种特别字符,问第二个字符串能否和第一个匹配. ...

  5. 2017多校第9场 HDU 6161 Big binary tree 思维,类似字典树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6161 题意: 题目是给一棵完全二叉树,从上到下从左到右给每个节点标号,每个点有权值,初始权值为其标号, ...

  6. 2017多校第10场 HDU 6181 Two Paths 次短路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6181 题意:给一个图,求出次短路. 解法:我之前的模板不能解决这种图,就是最短路和次短路相等的情况,证 ...

  7. 2017多校第10场 HDU 6180 Schedule 贪心,multiset

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6180 题意:给了一些任务的开始时间和终止时间,现在让我们安排k台及机器,让这些任务在k太机器上最小,并 ...

  8. 2017多校第10场 HDU 6178 Monkeys 贪心,或者DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6178 题意:给出一棵有n个节点的树,现在需要你把k只猴子放在节点上,每个节点最多放一只猴子,且要求每只 ...

  9. 2017多校第10场 HDU 6171 Admiral 双向BFS或者A*搜索

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6171 题意: 给你一个高度为6的塔形数组,你每次只能将0与他上下相邻的某个数交换,问最少交换多少次可以 ...

随机推荐

  1. poj1456——Supermarket

    Supermarket Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14656   Accepted: 6656 Desc ...

  2. Socket_SSH-1

    服务器端: import socket,os server=socket.socket() server.bind(('localhost',9999)) server.listen() while ...

  3. [牛客Wannafly挑战赛27D]绿魔法师

    description newcoder 给你一个空的可重集合\(S\). \(n\)次操作,每次操作给出\(x\),\(k\),\(p\),执行以下操作: \(opt\ 1\):在S中加入x. \( ...

  4. POJ3422:Kaka's Matrix Travels——题解

    http://poj.org/problem?id=3422 题目大意: 从左上角走到右下角,中途取数(数>=0),然后该点的数变为0,求走k的总价值和最大值. ———————————————— ...

  5. BZOJ3076 & 洛谷3081:[USACO2013 MAR]Hill Walk 山走——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=3076 https://www.luogu.org/problemnew/show/P3081#sub ...

  6. [Leetcode] Construct binary tree from inorder and postorder travesal 利用中序和后续遍历构造二叉树

    Given inorder and postorder traversal of a tree, construct the binary tree. Note:  You may assume th ...

  7. HDOJ(HDU).2044-2049 递推专题

    HDOJ(HDU).2044-2049 递推专题 点我挑战题目 HDU.2044 题意分析 先考虑递推关系:从1到第n个格子的时候由多少种走法? 如图,当n为下方格子的时候,由于只能向右走,所以有2中 ...

  8. bzoj4300: 绝世好题(DP)

    按位DP f[i]表示第i位为1的最长子序列 #include<iostream> #include<cstring> #include<cstdlib> #inc ...

  9. 【简单算法】37.Shuffle an Array

    题目: 打乱一个没有重复元素的数组. 示例: // 以数字集合 1, 2 和 3 初始化数组. ,,}; Solution solution = new Solution(nums); // 打乱数组 ...

  10. Uva-oj Palindromes 暴力

     Palindromes Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Statu ...