n<=100000个点m<=300000条边有权无向联通图,给出K<=10000个特殊点求K个点中任意两点最短路的最小值。

方法一:K小,随便搞。先构造最短路树,在最短路树上Dijkstra,遇到第一个特殊点就返回。代码如下:

如下个头。首先时间复杂度显然超了,其次建树时要考虑重边,比较难搞。

方法二:多源最短路。

插播:多源最短路方法:把每个源加进初始队列即可。

(1)利用多源最短路求出每个特殊点到其它点的最短路和次短路,利用两个的和来更新。一位大神在比赛中用该方法A过。

(2)直接求每个特殊点到其它点的最短路,把Dijkstra中的vis数组去掉,就是凡是松弛过的点都扔进优先队列里,然后,在松弛前,如果该点已经有最短路了,(我认为)现在访问的这条路径是次短路,直接更新答案。

注意不能用  来自同个特殊点的最短路  更新答案,所以记每个点的最短路来自哪个特殊点。

(3)随机化。把K分成两部分S,T,求S到T的最短路,这样得到正确答案的概率为1/2,多分几次就可以把错误概率降到极低。

代码为方法二(2)。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<queue>
//#include<iostream>
using namespace std; int n,m,K;
#define maxn 100011
#define maxm 600011
const int inf=0x7fffffff;
struct Edge{int to,v,next;};
struct Graph
{
Edge edge[maxm];int le;
int first[maxn],dis[maxn],id[maxn],start[maxn];bool vis[maxn];
Graph()
{
memset(first,,sizeof(first));
le=;
}
void add_edge(int x,int y,int v)
{
Edge &e=edge[le];
e.to=y;e.v=v;
e.next=first[x];
first[x]=le++;
}
void insert(int x,int y,int v)
{
add_edge(x,y,v);
add_edge(y,x,v);
}
struct heapnode
{
int x,v;
bool operator < (const heapnode &b) const {return v<b.v;}
bool operator > (const heapnode &b) const {return v>b.v;}
};
priority_queue<heapnode,vector<heapnode>,greater<heapnode> > q;
int ans;
int dijkstra()
{
for (int i=;i<=n;i++) dis[i]=inf;
memset(id,,sizeof(id));
for (int i=;i<=K;i++)
{
dis[start[i]]=;
id[start[i]]=start[i];
q.push((heapnode){start[i],});
}
ans=inf;
while (!q.empty())
{
const int now=q.top().x,d=q.top().v;
q.pop();
if (d!=dis[now]) continue;
for (int i=first[now];i;i=edge[i].next)
{
const Edge &e=edge[i];
if (dis[e.to]!=inf && id[now]!=id[e.to])
ans=min(ans,dis[e.to]+d+e.v);
if (dis[e.to]>d+e.v)
{
dis[e.to]=d+e.v;
id[e.to]=id[now];
q.push((heapnode){e.to,dis[e.to]});
}
}
}
return ans;
}
}G;
int x,y,v;
int main()
{
scanf("%d%d%d",&n,&m,&K);
for (int i=;i<=K;i++) scanf("%d",&G.start[i]);
for (int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&v);
G.insert(x,y,v);
}
printf("%d\n",G.dijkstra());
return ;
}

汕头市赛srm8 C-3的更多相关文章

  1. 汕头市赛srm1X T3

    给n<=100000个点的树,每个点有一个01串,长度m<=200,串的可以随时01取反,串的每一位对应权Vi,从根节点到某个节点经过决定哪些串取反后取得的最大价值为某个点的权值,求:在这 ...

  2. 汕头市赛srm10 T2

    n个数,分组,数Ai要在至少含有Ai个数的组,求最多分多少组. 方法一:大的数应该尽量跟大的在一起,这样才能让小的出现很多很多组,所以从大到小排序,给当前序列中最大的数x分x个数.代码如下: #inc ...

  3. 汕头市队赛 C KMP codeforces B. Image Preview

    汕头市队赛题目传送门 codeforces题目传送门 这道题我的做法是 尝试先往左走然后往右走 或者先往右走然后往左走 然后注意一下枚举顺序就okay啦 #include<cstdio> ...

  4. 汕头市队赛SRM15

    T1——czl SRM 15 众所周知,czl家养了一只可♂爱的***(已屏蔽),那只东西很贪吃,所以czl家很多零食仓库,然而这些仓库里有很多老鼠. 为了心爱的***,czl决定点燃纯艾条,用烟熏老 ...

  5. 汕头市队赛 SRM 07 D 天才麻将少女kpm

    这道题放了很久还是回来补了 D 天才麻将少女KPM SRM 07 背景&&描述 天才麻将少女KPM立志要在日麻界闯出一番名堂.     KPM上周叒打了n场麻将,但她这次又没控分,而且 ...

  6. 汕头市队赛SRM 20 T3 灵魂觉醒

    背景 自从芽衣.布洛妮娅相继灵魂觉醒之后,琪亚娜坐不住了.自己可是第一个入驻休伯利安号的啊!于是她打算去找德丽莎帮忙,为她安排了灵魂觉醒的相关课程. 第一天,第一节课. “实现灵魂觉醒之前,你需要先将 ...

  7. 汕头市队赛SRM 20 T2不净的圣杯

    不净的圣杯 SRM 20 背景 作为一张BUG级别的卡,官方打算把它修改得人畜无害一些…… 虽然名字还没想好,但是能力大概是对敌方所有单位造成d点伤害,d为自己牌组中所有卡的编号的最大公约数.这无疑是 ...

  8. 汕头市队赛SRM 20 T1魔法弹

    T1 背景 “主角光环已经不能忍啦!” 被最强控制AP博丽灵梦虐了很长一段时间之后,众人决定联合反抗. 魂魄妖梦:“野怪好像被抢光了?” 十六夜咲夜:“没事,我们人多.” 然后当然是以失败告终了. 八 ...

  9. 汕头市队赛 SRM19 字符题

    从天上掉下来了个这样的问题: 有一个字符串 从中选出两个子串 A,B,求 A+B可以构成的不同串的个数. 还想知道,这么多个串中字典序最大的那一个. 某人捡到了这个问题,并把它扔给了你. [输入] 一 ...

随机推荐

  1. Spring源码:Spring IoC容器加载过程(1)

    Spring源码版本:4.3.23.RELEASE 一.加载过程概览 Spring容器加载过程可以在org.springframework.context.support.AbstractApplic ...

  2. 命令模式和php实现

    命令模式: 命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及支持可撤销的操作.命令模式是一种对象行为型模 ...

  3. 详解 Handler 消息处理机制(附自整理超全 Q&A)

    Android 为什么要用消息处理机制 如果有多个线程更新 UI,并且没有加锁处理,会导致界面更新的错乱,而如果每个更新操作都进行加锁处理,那么必然会造成性能的下降.所以在 Android 开发中,为 ...

  4. ZIP解压缩文件的工具类【支持多级目录|全】

    ZIP解压缩文件的工具类[支持多级目录|全] 作者:Vashon 网上有很多的加压缩示例代码,但是都只是支持一级目录的操作,如果存在多级目录的话就不行了.本解压缩工具类经过多次检查及重构,最终分享给大 ...

  5. Linux上用mvn安装node.js

    Linux上用mvn安装node.js 上一篇blog简略的讲了ubuntu系统的安装,接下来讲讲Ubuntu上的基于node.js的web开发环境的搭建. Node在快速构建网络服务有着极大的优势, ...

  6. vim下ctrl + s 僵死问题的解决

    vim下ctrl + s 僵死问题的解决 vim  使用vim习惯性手残Ctrl+S ,解决方法 : Ctrl + Q 就能恢复了

  7. qt 设置阴影 不显示黑色边框

    this->setAttribute(Qt::WA_TranslucentBackground);

  8. HTML5应用 + Cordova = 平台相关的混合应用

    Jerry之前的一篇文章 SAP Fiori应用的三种部署方式 曾经提到SAP Fiori应用的三种部署方式: On Premise环境下以ABAP BSP应用作为Fiori应用部署和运行的载体 部署 ...

  9. Android(java)学习笔记164:开发一个多界面的应用程序之不同界面间互相传递数据(短信助手案例)

    1.首先我们看看下面这个需求: 这里我们在A界面上,点击这个按钮"选择要发送的短信",开启B界面上获取网络上各种短信祝福语,然后B界面会把这些网络祝福语短信发送给A界面到" ...

  10. docker 创建容器与管理容器

    创建容器的选项 [root@mast ~]# docker container run --help Usage: docker container run [OPTIONS] IMAGE [COMM ...