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. C#调用python文件执行

    我的电脑环境是使用.net framework4.5.1,如果在调试过程中调不通请注意 我用的是Visual studion 2017,python组件下载地址:http://ironpython.c ...

  2. Asp.Net_HttpModule的应用

    IHttpModule向实现类提供模块初始化和处置事件. IHttpModule包含兩個方法: public void Init(HttpApplication context);public voi ...

  3. Ubuntu命令行运行C程序和C++程序

    首先Ctrl + T 打开一个终端,cd到你建立C/C++文件的目录下. 下面以建立 helloc.c 和 hellocpp.cpp 进行演示 vim helloc.c 按 i 进入插入操作,然后写C ...

  4. Hadoop版本的选择问题

    自从2013年下半年开始,hadoop的版本开始了快速的更新换代,这和通信和互联网行业(ICT)的发展是密切相关的.随着移动网络的和宽带网络的覆盖以及数据传输速率的提升,线上的数据有了爆炸式的增长.这 ...

  5. 拓扑排序(Topological Sort)

    Graph 拓扑排序(Topological Sort) 假设一个应用场景:你用 C 编写了一个爬虫工具,其中有很多自定义的库:queue.c.queue.h.stack.c.stack.h.heap ...

  6. 运用fancybox弹出div的方式弹出视频界面

    fancybox可以弹出很多窗体,甚至一个swf格式的小视频.但这样的swf视频播放的时候并没有任何的控件.只能重头看到尾,或者关闭.我们可以利用fancybox弹出div盒子的方式配合html5很快 ...

  7. 第一个spring冲刺总结及后诸葛亮报告(附团队贡献分)

    眨眼就完结了第一阶段的冲刺了,之前因为学校停电停水等诸多原因而导致冲刺完毕时间的推迟. 第一阶段总体是做到了运算的功能,只是一些基本的功能实现,但能保证的容错性能较高. 1.在普遍的四则运算中都能见到 ...

  8. Python爬虫:如何爬取分页数据?

    上一篇文章<Python爬虫:爬取人人都是产品经理的数据>中说了爬取单页数据的方法,这篇文章详细解释如何爬取多页数据. 爬取对象: 有融网理财项目列表页[履约中]状态下的前10页数据,地址 ...

  9. Docker(十七)-修改Docker容器启动配置参数

    有时候,我们创建容器时忘了添加参数 --restart=always ,当 Docker 重启时,容器未能自动启动, 现在要添加该参数怎么办呢,方法有二: 1.Docker 命令修改 docker c ...

  10. 深入 Nginx 之配置篇

     常用配置项 在工作中,我们与 Nginx 打交道更多的是通过其配置文件来进行.那么掌握这些配置项各自的作用就很有必要了. 首先,nginx.conf 的内容通常是这样的: ... ... #核心摸块 ...