题目描述

一张P个点的无向图,C条正权路。CLJ要从Pb点(家)出发,既要去Pa1点NOI赛场拿金牌,也要去Pa2点CMO赛场拿金牌。(途中不必回家)可以先去NOI,也可以先去CMO。当然神犇CLJ肯定会使总路程最小,输出最小值。

题解:做两遍spfa,找出从起点开始先去pa1或者先去pa2的最小值

需要用一下spfa的优化,每次进行入队的时候都与队头进行比较,如果比队头小就放在队头,否则放队尾。

#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
#define maxm 200005
int dis[maxn],head[maxn],q[maxn];
bool vis[maxn];
struct edge{
int next,to,w;
}e[maxm*];
int n,m,s,t1,t2;
int ans=,cnt;
inline int read(){
int x=,f=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void insert(int u,int v,int w){
cnt++;
e[cnt].next=head[u];e[cnt].to=v;e[cnt].w=w;
head[u]=cnt;
}
void spfa(int x){
memset(dis,,sizeof dis);
vis[x]=;dis[x]=;q[]=x;
int top=,tail=;
while(top!=tail)
{
int now=q[top];top++;
if(top==)top=;
for(int i=head[now];i;i=e[i].next){
int p=e[i].to;
if(dis[p]>dis[now]+e[i].w){
dis[p]=dis[now]+e[i].w;
if(!vis[p]){
vis[p]=;
if(dis[p]<dis[q[top]]){
top--;if(top<)top=;
q[top]=p;
}
else{
q[tail++]=p;
if(tail==)tail=;
}
}
}
}
vis[now]=;
}
}
int main(){
m=read();n=read();s=read();t1=read();t2=read();
int u,v,w;
for(int i=;i<=m;i++){
u=read();v=read();w=read();
insert(u,v,w);insert(v,u,w);
}
spfa(t1);
ans=dis[s]+dis[t2];
spfa(t2);
ans=min(ans,dis[s]+dis[t1]);
printf("%d",ans);
}

最新文章

  1. BI项目记笔记索引
  2. setTimeout()与setInterval()
  3. 各类 HTTP 返回状态代码详解
  4. GreenDao官方文档翻译(上)
  5. HL7及PIX相关的测试工具
  6. hdu 1018
  7. 【今日推荐】10大流行的 Metro UI 风格的 Bootstrap 主题和模板
  8. 《算法问题实战策略》——chaper9——动态规划法技巧
  9. Saiku图表导出时中文显示问题的解决方法
  10. leetcode day7
  11. 织梦调用seotitle
  12. 【CJOJ P1333】【HNOI2012】矿场搭建
  13. python 变量进阶(理解)
  14. IT常用单词
  15. python程序里加入调试断点
  16. 子查询中的NULL问题
  17. python基础----继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法
  18. Vue基础-渲染函数-父子组件-传递数据
  19. as3.2版本中中jar生成方法
  20. Spring知识点小结(四)

热门文章

  1. (八)统一配置中心-Config
  2. Linux 清空缓存
  3. win10关闭更新
  4. img图片在ie上有有空隙
  5. ZBrush中常用笔刷综合简介
  6. 洛谷P3254 圆桌问题 网络流_二分图
  7. dockerhub 推送镜像
  8. vue-cli解析
  9. Login.hbm.xml
  10. HDU1232 畅通project 并查集