USACO 2006 Nov. Gold

贝茜把家搬到了一个小农场,但她常常回到 FJ 的农场去拜访她的朋友。贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路。

贝茜所在的乡村有 R(1≤R≤10^5) 条双向道路,每条路都连接了所有的 N(1≤N≤5000) 个农场中的某两个。贝茜居住在农场 1,她的朋友们居住在农场 N(即贝茜每次旅行的目的地)。

贝茜选择的第二短的路径中,可以包含任何一条在最短路中出现的道路,并且一条路可以重复走多次。当然第二短路的长度必须严格大于最短路(可能有多条)的长度,但它的长度必须不大于所有除最短路外的路径的长度。

一句话题意:给一张无向图,求这张图的严格次短路之长。

输入格式
输入文件的第 1 行为两个整数,N 和 R,用空格隔开;

第 2…R+1 行:每行包含三个用空格隔开的整数 A、B 和 D,表示存在一条长度为 D(1≤D≤5000) 的路连接农场 A 和农场 B。

输出格式
输出仅一个整数,表示从农场 1 到农场 N 的第二短路的长度。

样例
样例输入
4 4
1 2 100
2 4 200
2 3 250
3 4 100
样例输出
450
样例解释
最短路:1→2→4(长度为 100+200=300)
第二短路:1→2→3→4(长度为 100+250+100=450)

 

_____________________________________________________________

设两个数组dis[ ]和disf[ ],分别记录1号点到到该节点的最短距离和次短距离。

然后dij就可以了。因为每个点有最短和次短两个两,所以不能用vis[ ]数组进行判断该节点是否已经求出解。

_____________________________________________________________

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=5010;
4 const int maxm=1e5+10;
5 int n,m;
6 struct edge
7 {
8 int u,v,w,nxt;
9 }e[maxm<<1];
10 int head[maxn],js;
11 void addage(int u,int v,int w)
12 {
13 e[++js].u=u;e[js].v=v;e[js].w=w;
14 e[js].nxt=head[u];head[u]=js;
15 }
16 struct node
17 {
18 int dis,p;
19 bool operator < (node b)const
20 {
21 return dis>b.dis;
22 }
23 };
24 int dis[maxn],disf[maxn];
25
26 void dij(int x)
27 {
28 memset(dis,0x3f,sizeof dis);
29 memset(disf,0x3f,sizeof disf);
30 dis[x]=0;
31 priority_queue<node>q;
32 q.push((node){0,x});
33 while(!q.empty())
34 {
35 node t=q.top();
36 q.pop();
37 int d=t.dis,u=t.p;
38 for(int i=head[u];i;i=e[i].nxt)
39 {
40 int v=e[i].v;
41 if(dis[v]>d+e[i].w)
42 {
43 disf[v]=dis[v];
44 dis[v]=d+e[i].w;
45 q.push((node){dis[v],v});
46 }
47 else if(dis[v]==d+e[i].w)continue;
48 else if(disf[v]>d+e[i].w)
49 {
50 disf[v]=d+e[i].w;
51 q.push((node){disf[v],v});
52 }
53 }
54 }
55 }
56 int main()
57 {
58 scanf("%d%d",&n,&m);
59 for(int u,v,w,i=1;i<=m;++i)
60 {
61 scanf("%d%d%d",&u,&v,&w);
62 addage(u,v,w);
63 addage(v,u,w);
64 }
65 dij(1);
66 cout<<disf[n];
67 return 0;
68 }

LOJ10076的更多相关文章

随机推荐

  1. device_create为何可以在/sys/class/具体类/属性文件?怎么实现的

    答案: 版本3.6.9: device_create -> device_register -> device_add -> device_add_attrs -> devic ...

  2. 多线程写法,消除同步bug

    public class Demo01 implements Runnable { private int ticket = 10; @Override public void run() { for ...

  3. 使用jmeter进行压力测试与nginx连接数优化

    案例训练目标 学会使用jmeter工具 学会配置nginx连接数优化 包含技能点 使用jmeter做压力测试 配置nginx的并发连接数 环境要求 PC支持VT,4G内存以上:vmware虚拟机安装有 ...

  4. Linux 时间同步 04 ntp时间同步

    Linux 时间同步 04 ntp时间同步 目录 Linux 时间同步 04 ntp时间同步 安装ntp 配置与外部时间服务器进行时间同步的客户端主机 配置其他客户端与以上客户端主机时间同步 验证查看 ...

  5. 伯俊BOS2.0关于订金单的处理方案

    订金单功能调整设计 一.     功能确认 BPOS关于订金的使用对应的是"预收单",原"预收单"设置有商品明细,根据客户对订金的需求,取消原有"商品 ...

  6. k8s之DNS服务器搭建

    一.导读 在使用k8s部署springboot+redis简单应用这篇文章中,spring boot连接redis是直接使用的IP连接,那么可不可以直接使用服务名称进行连接呢?答案是可以的,这就是k8 ...

  7. 使用python做一个IRC在线下载器

    使用python做一个IRC在线下载器 1.开发流程 2.软件流程 3.开始 3.0 准备工作 3.1寻找API接口 3.2 文件模块 3.2.1 选择文件弹窗 3.2.2 提取文件名 3.2.2.1 ...

  8. Linux命令整理,用户管理,用户组管理,系统管理,目录管理常用命令

    知识点梳理 Linux课堂笔记 学习目标 能够知道什么是Linux系统以及它的应用场景 能够独立完成安装VMware虚拟机和网络配置 能够独立完成安装CentOS以及远程终端SecureCRT 能够熟 ...

  9. 人生苦短我用Python,本文助你快速入门

    目录 前言 Python基础 注释 变量 数据类型 浮点型 复数类型 字符串 布尔类型 类型转换 输入与输出 运算符 算术运算符 比较运算符 赋值运算符 逻辑运算符 if.while.for 容器 列 ...

  10. Linux Bash Shell常用快捷键

    Linux Bash Shell常用快捷键 table { margin: auto } 快捷键 功能 tab 补全 ctrl + a 光标回到命令行首 ctrl + e 光标回到命令行尾 ctrl ...