【最短路】【dijkstra】【二进制拆分】hdu6166 Senior Pan
题意:给你一张带权有向图,问你某个点集中,两两结点之间的最短路的最小值是多少。
其实就是dijkstra,只不过往堆里塞边的时候,要注意塞进去它是从集合中的哪个起始点过来的,然后在更新某个点的答案的时候,如果它是集合中的点,除了最开始入堆的那次以外,要再更新一遍,并且不能用从本身过来的路径进行更新。
std虽然跑了20次dijkstra,但是还是有一些可取之处。
将一个集合中的每个数进行二进制拆分,然后枚举每一位,将该位为0的归入一个半,再将该位为1的归入另一半。这样划分log次,每次只取跨越两半的点对。就必然能覆盖所有点对。
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int T,n,m,en,f[100005],head[100005],nxt[100005],to[100005],u,v,vis[100005];
long long dis[100005],d;
struct node{
int from,to;
long long dis;
node() {}
node(int from,int to,long long dis):from(from),to(to),dis(dis){ }
};
bool operator <(const node &a,const node &b)
{
return a.dis>b.dis;
}
priority_queue<node> Q;
void add(int u,int v,long long d)
{
nxt[++en]=head[u];
head[u]=en;
to[en]=v;
dis[en]=d;
}
int main()
{
scanf("%d",&T);
for(int TT=1;TT<=T;++TT)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i)
{
scanf("%d%d%lld",&u,&v,&d);
add(u,v,d);
}
int t,tt;
scanf("%d",&t);
for(int i=1;i<=t;++i)
{
scanf("%d",&tt);
f[tt]=1;
for(int j=head[tt];j;j=nxt[j])
{
Q.push(node(tt,to[j],dis[j]));
}
}
node now;
while(!Q.empty())
{
now=Q.top();
Q.pop();
if(f[now.to])
{
if(now.from==now.to)
{ }
else
{
printf("Case #%d: %lld\n",TT,now.dis);
break;
}
}
else
{
if(vis[now.to]<2)
{
vis[now.to]++;
for(int i=head[now.to];i;i=nxt[i])
{
Q.push(node(now.from,to[i],dis[i]+now.dis));
}
}
}
}
while(!Q.empty()) Q.pop();
memset(head,0,sizeof head);
memset(f,0,sizeof f);
memset(vis,0,sizeof vis);
en=0; }
return 0;
}
【最短路】【dijkstra】【二进制拆分】hdu6166 Senior Pan的更多相关文章
- hdu6166 Senior Pan
Senior Pan Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- BZOJ 2069: [POI2004]ZAW(Dijkstra + 二进制拆分)
题意 给定一个有 \(N\) 个点 \(M\) 条边的无向图, 每条无向边 最多只能经过一次 . 对于边 \((u, v)\) , 从 \(u\) 到 \(v\) 的代价为 \(a\) , 从 \(v ...
- 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 fails in his discrete math exam again. So he asks Master ZKC to give him graph theory pro ...
- HDU 6166 Senior Pan 二进制分组 + 迪杰斯特拉算法
Senior Pan Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Probl ...
- HDU 6166 Senior Pan (最短路变形)
题目链接 Problem Description Senior Pan fails in his discrete math exam again. So he asks Master ZKC to ...
- hdu 2544 最短路 Dijkstra
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目分析:比较简单的最短路算法应用.题目告知起点与终点的位置,以及各路口之间路径到达所需的时间, ...
- 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法
图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...
- hdu 2844 coins(多重背包 二进制拆分法)
Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...
随机推荐
- Elements in iteration expect to have 'v-bind:key' directives.
code->首选项->设置->在搜索框中输入:vetur.validation.template->你懂的
- Windows下基于python3使用word2vec训练中文维基百科语料(三)
对前两篇获取到的词向量模型进行使用: 代码如下: import gensim model = gensim.models.Word2Vec.load('wiki.zh.text.model') fla ...
- Android中的异常情况
1.setText()方法中,如果参数是int类型,Android会把它当做是一个id查找,报以下异常,因此解决办法就是将参数转化为String类型 如:setText(num) è setText( ...
- Eureka Server的高可用
Eureka Server进行互相注册的方式来实现高可用的部署,所以我们只需要将Eureke Server配置其他可用的serviceUrl就能实现高可用部署 创建application-peer1. ...
- device tree source file position
android/kernel/msm-4.9/arch/arm64/boot/dts/qcom/
- Call Mode feature
起源 user 在插著 充電器 打電話的狀況下, 為了安全起見, 避免 充電器在這時損害手機,間接造成 user 的傷害, 而有了這 feature, 在 battery voltage Vbat & ...
- python实战===itchat
import itchat itchat.login() friends=itchat.get_friends(update=True)[0:] male=female=other=0 for i i ...
- mongodb 学习笔记 3 --- 查询
在mongodb的查询中可以通过使用如下操作符进行深度查询 1.条件操作符 $gt $gte : > >= {"age":{"$gt":18 ...
- java的集合类面试题
转自:https://yq.aliyun.com/articles/78788?spm=5176.8252056.759076.3.uFYrmt java.util包中包含了一系列重要的集合类,而对于 ...
- HTML5API(3)
十一.ajax同源操作 URL说明是否允许通信 同一域名下允许 http://www.a.com/a.js , http://www.a.com/b.js 同一域名下不同文件夹允许 http://ww ...