hdu 6166 Senior Pan
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的更多相关文章
- HDU 6166 Senior Pan (最短路变形)
题目链接 Problem Description Senior Pan fails in his discrete math exam again. So he asks Master ZKC to ...
- 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 二进制分组 + 迪杰斯特拉算法
Senior Pan Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Probl ...
- 2017多校第9场 HDU 6166 Senior Pan 堆优化Dij
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6166 题意:给你一个有向图,然后给你k个点,求其中一个点到另一个点的距离的最小值. 解法:枚举二进制位 ...
- HDU 6166 Senior Pan(k点中最小两点间距离)题解
题意:n个点,m条有向边,指定k个点,问你其中最近的两点距离为多少 思路:这题的思路很巧妙,如果我们直接枚举两点做最短路那就要做C(k,2)次.但是我们换个思路,我们把k个点按照二进制每一位的0和1分 ...
- HDU 6166 Senior Pan(二进制分组+最短路)
题意 给出一个\(n\)个点\(m\)条边的有向图\((n,m<=100000)\),从中选择\(k\)个点\((k<=n)\),问这k个点两两之间的最短路最小值是多少? 思路 直接的想法 ...
- HDU 6166 Senior Pan(多校第九场 二进制分组最短路)
题意:给出n个点和m条有向边(有向边!!!!我还以为是无向查了半天),然后给出K个点,问这k个点中最近的两点的距离 思路:比赛时以为有询问,就直接丢了,然后这题感觉思路很棒,加入把所有点分成起点和终点 ...
- hdu 6169 Senior PanⅡ Miller_Rabin素数测试+容斥
Senior PanⅡ Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others) Pr ...
- 2017多校第9场 HDU 6169 Senior PanⅡ 数论,DP,爆搜
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6169 题意:给了区间L,R,求[L,R]区间所有满足其最小质数因子为k的数的和. 解法: 我看了这篇b ...
随机推荐
- Sleeping会话导致阻塞原理(上)
背景 我在处理客户问题的时候,客户经常搞不懂sleeping 的由来,和他可能导致的问题.下面来详细说下 什么是sleeping 其实我们经常可以在数据库中看到“”sleeping“状态的连接,但是这 ...
- 【拾遗】理解Javascript中的Arguments
前言 最近在看JavaScript相关的知识点,看到了老外的一本Javascript For Web Developers,遇到了一个知识盲点,觉得老外写的很明白很透彻,记录下来加深印象,下面是我摘出 ...
- centos 7 tomcat 开机自启
第一章 1.将tomcat加入开启自己,以减少手动启动的麻烦 环境配置需要提前配置好.(我这里已经是不做操作了) 192.168.1.195 jdk1.8 + tomcat 8 第二章 2.编写to ...
- MOSFET中的重要参数
最近在调试MOSFET电路中,发现了更多问题,比如同样的PI反馈控制电路可以很好的控制PMOS工作,却对NMOS不能很好控制.当然你肯定会说那是因为PMOS和NMOS不同呀,这自然没有错,我在上一篇文 ...
- Linux/Mac 挂载远程服务器目录到本地
1. 安装 sudo apt-get installsshfs 2. 创建SSHFS 挂载目录 sudo mkdir/mnt/siyuan 3.使用SSHFS 挂载远程的文件系统 sudo sshfs ...
- RyuBook1.0案例二:Traffic Monitor项目源码分析
Traffic Monitor源码分析 从simple_switch_13.SimpleSwitch13控制器继承并开发 class SimpleMonitor13(simple_switch_13. ...
- vs2013安装过程及使用心得
进入http://www.itellyou.cn/ 方法/步骤 1 1:点击中文简体 2:钩出前面的空格 3:点击详细信息 4:复制到网页进行搜索迅雷下载 等待下载完成之后,双击文件 我们双击文件 ...
- 11th 本周工作量及进度统计
本周PSP: C(类别) C(内容) S(开始时间) ST(结束时间) I(中断时间) T(实际时间) 文档 11月30日 回顾5个问题 13:00 13:50 2 48 11月30日 如果重新来过 ...
- postman 学习网址
postman使用详解: http://gold.xitu.io/entry/57597a62a341310061337885 https://www.getpostman.com/docs/writ ...
- 基于Vue-cli 快速搭建项目
Vue-cli可以快速帮助我们创建一个项目,这是官方给我们提供的脚手架.下面我说一下vue-cli的使用方法. 一.准备工作 在使用vue-cli时,首先需要安装nodejs,npm,其次需全局安装v ...