题意:给你一张带权有向图,问你某个点集中,两两结点之间的最短路的最小值是多少。

其实就是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的更多相关文章

  1. hdu6166 Senior Pan

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

  2. BZOJ 2069: [POI2004]ZAW(Dijkstra + 二进制拆分)

    题意 给定一个有 \(N\) 个点 \(M\) 条边的无向图, 每条无向边 最多只能经过一次 . 对于边 \((u, v)\) , 从 \(u\) 到 \(v\) 的代价为 \(a\) , 从 \(v ...

  3. HDU 6166.Senior Pan()-最短路(Dijkstra添加超源点、超汇点)+二进制划分集合 (2017 Multi-University Training Contest - Team 9 1006)

    学长好久之前讲的,本来好久好久之前就要写题解的,一直都没写,懒死_(:з」∠)_ Senior Pan Time Limit: 12000/6000 MS (Java/Others)    Memor ...

  4. HDU - 6166:Senior Pan(顶点集合最短路&二进制分组)

    Senior Pan fails in his discrete math exam again. So he asks Master ZKC to give him graph theory pro ...

  5. HDU 6166 Senior Pan 二进制分组 + 迪杰斯特拉算法

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

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

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

  7. hdu 2544 最短路 Dijkstra

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目分析:比较简单的最短路算法应用.题目告知起点与终点的位置,以及各路口之间路径到达所需的时间, ...

  8. 算法学习笔记(三) 最短路 Dijkstra 和 Floyd 算法

    图论中一个经典问题就是求最短路.最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划.这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是 ...

  9. hdu 2844 coins(多重背包 二进制拆分法)

    Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...

随机推荐

  1. Billboard HDU 2795 (线段树)

    题目链接 Problem Description At the entrance to the university, there is a huge rectangular billboard of ...

  2. 如何用js自己实现Animate运动函数

    js运动是我们学习js必不可少的研究部分,首先我们要知道js的运动其实仅仅是不断改变元素的某个属性值而已,比如不断改变一个绝对定位div的left值,那么你看到的效果就是这个div不断的向右边运动,那 ...

  3. 大聊Python----quene队列

    当必须在多个线程之间安全地交换信息时,队列在线程编程中特别有用. class queue.Queue(maxsize=0)  # 先入先出class queue.LifoQueue(maxsize=0 ...

  4. ubuntu tomcat的安装与配置

    一.下载jdk 大概是tomat大部分是由java写的, 所以一开始安装tomcat必须得配置好jdk http://www.oracle.com/technetwork/java/javase/do ...

  5. url编码模块

    use LWP::SImple; use URI::Escape; encoded_string = uri_escape(raw_string); get(encoded_string);

  6. epoll内核源码分析

    转载:https://www.nowcoder.com/discuss/26226?type=0&order=0&pos=27&page=1 /*  *  fs/eventpo ...

  7. 005 JAVA多线程和并发基础面试问答(转载)

    原文链接:http://ifeve.com/java-multi-threading-concurrency-interview-questions-with-answers/ 多线程和并发问题是Ja ...

  8. 【Educational Codeforces Round 22】

    又打了一场EDU,感觉这场比23难多了啊…… 艹还是我太弱了. A. 随便贪心一下. #include<bits/stdc++.h> using namespace std; ,ans=- ...

  9. python库-urllib

    urllib库提供了一系列操作url的功能,是python处理爬虫的入门级工具,网上的学习资料也很多.我做爬虫是一开始就用了Scrapy框架,并不是一步步从urllib开始的,反而是在后来解决一些小问 ...

  10. vue 的过滤器

    1.0版本: limitBy filteBy orderBy lowerBy upperBy json currency capitalize pluralize debounce 2.0版本: 要自 ...