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 ...
随机推荐
- Asp.Net_Form验证跟授权
配置文件的<system.web></system.web>结点下添加如下代码: <!--身份验证方式--> <authentication mode=&qu ...
- docker-compose编排
创建并启动容器 docker-compose up -d 备注: -d 后台启动并运行容器 前提是你在执行该命令的时候已经编写好了docker-compose.yml文件,在这个文件的当前目录执行上述 ...
- LeetCode 9. Palindrome Number(回文数)
Determine whether an integer is a palindrome. An integer is a palindrome when it reads the same back ...
- 开源一个最近写的spring与mongodb结合的demo(spring-mongodb-demo)
由于工作需要,给同事们分享了一下mongodb的使用,其中主要就是做了一个spring-data+mongodb的小例子,本着分享的精神,就上传到了github.com上,有需要的同学请移步githu ...
- linux gcc编译多个源文件的方法
http://blog.csdn.net/yinjiabin/article/details/7731817
- C语言版本:单链表的实现
slist.h #ifndef __SLIST_H__ #define __SLIST_H__ #include<cstdio> #include<malloc.h> #inc ...
- Day Nine
站立式会议 站立式会议内容总结 331 今天:学习plupload 遇到问题:无 明天:学习中文分词 442 今天:解决gradle以及项目计划页面的bug 遇到的问题:调用工具类以及配置gradle ...
- SDN开源项目以及组织机构
SDN开源项目以及组织机构 以上内容均摘自网络 如有侵权,请转告笔者,立即删除 两大组织 ONF (Open Networking Foundation) Google.Facebook.Micros ...
- Linux命令(六) 查看文件 cat tac more less tail
如果要查看文件,使用 cat less tac tail 和 more 中的任意一个即可. 1.cat 使用 cat 命令查看文件时会显示整个文件的内容,注意cat只能查看文本文件的内容,如 ...
- [转帖]Programmer’s guide to the big tech companies 💻
Programmer’s guide to the big tech companies