http://acm.hdu.edu.cn/showproblem.php?pid=6166

题意:

给出一张无向图,给定k个特殊点

求这k个特殊点两两之间的最短路

二进制分组

枚举一位二进制位

这一位为1的放到起点集合

这一位为0的放到终点集合

跑一遍两个集合间的最短路

因为是有向图,反过来再跑一遍

正确性分析:

设最优解是x和y间的最短路

若x和y被分在了两个不同的集合,那么两个集合的最短路就是x和y的最短路

而任意两个点至少有一位二进制不同

所以一定会有x和y分在两个不同集合的时候

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm> using namespace std; #define N 100001 typedef long long LL; int n,k; int front[N],to[N],nxt[N],val[N],tot; int point[N]; struct node
{
int id;
LL dis; node(int id_=,LL dis_=):id(id_),dis(dis_){} bool operator < (node p) const
{
return dis>p.dis;
}
};
priority_queue<node>q; bool End[N],vis[N]; LL dis[N];
LL ans; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void add(int u,int v,int w)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; val[tot]=w;
} void dijkstra()
{
node now;
while(!q.empty())
{
now=q.top();
q.pop();
if(vis[now.id]) continue;
vis[now.id]=true;
for(int i=front[now.id];i;i=nxt[i])
if(dis[now.id]+val[i]<dis[to[i]])
{
dis[to[i]]=dis[now.id]+val[i];
if(End[to[i]]) ans=min(ans,dis[to[i]]);
else q.push(node(to[i],dis[to[i]]));
}
}
} void solve()
{
int S,bit;
for(S=;(<<S)-<k;++S);
for(int j=;j<=S;++j)
{
bit=<<j-;
memset(End,false,sizeof(End));
memset(vis,false,sizeof(vis));
memset(dis,,sizeof(dis));
for(int i=;i<=k;++i)
{
if(point[i] & bit) q.push(node(point[i],)),dis[point[i]]=;
else End[point[i]]=true;
}
dijkstra();
memset(End,false,sizeof(End));
memset(vis,false,sizeof(vis));
memset(dis,,sizeof(dis));
for(int i=;i<=k;++i)
{
if(!(point[i] & bit)) q.push(node(point[i],)),dis[point[i]]=;
else End[point[i]]=true;
}
dijkstra();
}
} void clear()
{
tot=;
memset(front,,sizeof(front));
ans=1e18;
} int main()
{
int T;
int m;
int u,v,w;
read(T);
for(int t=;t<=T;++t)
{
clear();
read(n); read(m);
while(m--)
{
read(u); read(v); read(w);
add(u,v,w);
}
read(k);
for(int i=;i<=k;++i) read(point[i]);
solve();
printf("Case #%d: %I64d\n",t,ans);
}
}

hdu 6166 Senior Pan的更多相关文章

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

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

  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 二进制分组 + 迪杰斯特拉算法

    Senior Pan Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Probl ...

  4. 2017多校第9场 HDU 6166 Senior Pan 堆优化Dij

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6166 题意:给你一个有向图,然后给你k个点,求其中一个点到另一个点的距离的最小值. 解法:枚举二进制位 ...

  5. HDU 6166 Senior Pan(k点中最小两点间距离)题解

    题意:n个点,m条有向边,指定k个点,问你其中最近的两点距离为多少 思路:这题的思路很巧妙,如果我们直接枚举两点做最短路那就要做C(k,2)次.但是我们换个思路,我们把k个点按照二进制每一位的0和1分 ...

  6. HDU 6166 Senior Pan(二进制分组+最短路)

    题意 给出一个\(n\)个点\(m\)条边的有向图\((n,m<=100000)\),从中选择\(k\)个点\((k<=n)\),问这k个点两两之间的最短路最小值是多少? 思路 直接的想法 ...

  7. HDU 6166 Senior Pan(多校第九场 二进制分组最短路)

    题意:给出n个点和m条有向边(有向边!!!!我还以为是无向查了半天),然后给出K个点,问这k个点中最近的两点的距离 思路:比赛时以为有询问,就直接丢了,然后这题感觉思路很棒,加入把所有点分成起点和终点 ...

  8. hdu 6169 Senior PanⅡ Miller_Rabin素数测试+容斥

    Senior PanⅡ Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others) Pr ...

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

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

随机推荐

  1. 微信小程序中跳转另一个小程序

    wx.navigateToMiniProgram({ appId: 'xxxxxxxxxxxxxxxxxx', // 要跳转的小程序的appid path: 'page/index/index', / ...

  2. 异步编程之asyncio简单介绍

    引言: python由于GIL(全局锁)的存在,不能发挥多核的优势,其性能一直饱受诟病.然而在IO密集型的网络编程里,异步处理比同步处理能提升成百上千倍的效率,弥补了python性能方面的短板. as ...

  3. 七个要素帮你打造现象级手游!优化程度堪比《QQ飞车》

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由WeTest质量开放平台团队发表于云+社区专栏 作者:申江涛,腾讯互娱客户端工程师 商业转载请联系腾讯WeTest获得授权,非商业转载 ...

  4. .net中操作Visual SourceSafe

    最近整理一些资料,发现以前写的一段代码,提供对微软的版本管理软件visual sourcesafe的一些操作.以下简称vss. 想起以前写的时候,因为资料比较匮乏,只能边研究边测试,走了不少弯路. 由 ...

  5. Redis学习笔记之Redis的对象

    类型与编码: typedef struct redisObject {                unsigned type:4://类型               unsigned encod ...

  6. process.tar.gz

    exec1.c #include <stdio.h> #include <unistd.h> int main() { char *arglist[3]; arglist[0] ...

  7. C++:派生类的构造函数和析构函数的调用顺序

    一.派生类 在C++编程中,我们在编写一个基类的派生类时,大致可以分为四步: • 吸收基类的成员:不论是数据成员还是函数成员,派生类吸收除基类的构造函数和析构函数之外的全部成员. • 改造基类函数:在 ...

  8. javascript 函数的几种声明函数以及应用环境

    本页只列出常用的几种方式,当然还有比如new Function()以及下面三种的组合. 1.函数式声明 例子:function sum(a,b){ return a+b; }; 2.函数表达式声明(匿 ...

  9. 软工实践练习一 git使用心得

    使用git进行代码管理的心得 小组 1.结对的同学创建了小组,我属于被邀请的.附上图片一张. 2.已将代码库https://github.com/sefzu2015/AutoCS fork到了小组or ...

  10. PAT 甲级 1106 Lowest Price in Supply Chain

    https://pintia.cn/problem-sets/994805342720868352/problems/994805362341822464 A supply chain is a ne ...