###题目链接 洛谷 P2176 ###

题目大意:

已知农夫从 1 走到 N 点,一定走的是最短路。问你将某条路的长度变为其两倍后,农夫从 1 走到 N 点的路程最大增加多少,输出最大增量。

分析:

1、很显然,如果增大某条路长度会使得最短路增加,那么这条路必为原先最短路径上的某条路。

2、故只需要记录边的 id ,然后依次枚举该条路长度翻倍后的最短路径,然后取与一开始最短路的差值的最大值即可。

3、记得用 id[] 存储路径编号,然后要分别更改这条路径两个方向的边的值(因为是无向边)。

4、时间复杂度应该是 N * M * logM ,本题大约为 107 ,1s 应该够了。

代码如下:

#define IO freopen("test.in","r",stdin),freopen("test.out","w",stdout)
#include <set>
#include <map>
#include <deque>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <bitset>
#include <cstdio>
#include <string>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
#define inf 0x3f3f3f3f
#define maxn 108
typedef pair<int,int> P;
int n,m,cnt;
int head[maxn],dist[maxn],pre[maxn],id[maxn],a[maxn];
bool vis[maxn];
struct Edge
{
int to;
int val;
int next;
}edge[];
inline void add(int u,int v,int w)
{
edge[++cnt].to=v;
edge[cnt].val=w;
edge[cnt].next=head[u];
head[u]=cnt;
return;
}
int dijkstra()
{
for(int i=;i<=n;i++) dist[i]=inf,vis[i]=false;
priority_queue<P,vector<P>,greater<P> > q;
while(!q.empty()) q.pop();
q.push(make_pair(,));
dist[]=;
while(!q.empty())
{
int u=q.top().second,t=q.top().first;
q.pop();
if(vis[u]) continue;
if(u==n) return dist[n];
vis[u]=true;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].to;
if(dist[v]>dist[u]+edge[i].val){
dist[v]=dist[u]+edge[i].val;
pre[v]=u,id[v]=i;
q.push(make_pair(dist[v],v));
}
}
}
return dist[n];
}
int main()
{
//IO;
scanf("%d%d",&n,&m);
int A,B,C;
while(m--)
{
scanf("%d%d%d",&A,&B,&C);
add(A,B,C),add(B,A,C);
}
int s=dijkstra();
int x=n;
cnt=;
while(id[x]){
a[++cnt]=id[x];
x=pre[x];
}
int ans=-;
for(int i=;i<=cnt;i++){
if(a[i]%==){
edge[a[i]-].val*=,edge[a[i]].val*=;
int res=dijkstra();
ans=max(ans,res-s);
edge[a[i]-].val/=,edge[a[i]].val/=;
}
else{
edge[a[i]].val*=,edge[a[i]+].val*=;
int res=dijkstra();
ans=max(ans,res-s);
edge[a[i]].val/=,edge[a[i]+].val/=;
}
}
printf("%d\n",ans );
}

洛谷 P2176(最短路)的更多相关文章

  1. 洛谷P1144 最短路计数(SPFA)

    To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M ...

  2. 洛谷 1144 最短路计数 bfs

    洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移, ...

  3. 洛谷 P2384 最短路

    洛谷 P2384 最短路 题目背景 狗哥做烂了最短路,突然机智的考了Bosh一道,没想到把Bosh考住了...你能帮Bosh解决吗? 他会给你10000000000000000000000000000 ...

  4. 洛谷2483 k短路([SDOI2010]魔法猪学院)

    题目请戳这里 一句话题意: 给你一张n个节点,m条单向边的图,求1到n第k短的路. emmm,纪念第一个黑题(我是真的菜啊!!) 这题目还是很难的,本蒟蒻只会被洛谷卡掉的A(所以就愉快地特判了),首先 ...

  5. 洛谷——P2176 [USACO14FEB]路障Roadblock

    P2176 [USACO14FEB]路障Roadblock 题目描述 每天早晨,FJ从家中穿过农场走到牛棚.农场由 N 块农田组成,农田通过 M 条双向道路连接,每条路有一定长度.FJ 的房子在 1 ...

  6. 洛谷 P1144 最短路计数 Label:水

    题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行 ...

  7. 洛谷P1144最短路计数题解

    最短路计数 此题还是寻找从1到i点总共有几个最短路且每条边的边长为1,对于这种寻找最短路的个数,我们可以反向搜索,即先用\(SPFA\)预处理出所有点的最短路,然后我们反向记忆化搜索,可以用\(sum ...

  8. 洛谷P1144 最短路计数

    题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行 ...

  9. 洛谷 P1144 最短路计数

    传送门:https://www.luogu.org/problemnew/show/P1144 这虽然是一道普及+的题,然而我发现我现在还没做过,这也就直接导致我今天模拟T2只杠了个暴力分…… 那这道 ...

随机推荐

  1. C# $插值符号

    概述 $ 符是在C#6.0出现的一个新特性,本质就是C#的一个语法糖,作用在于替代当前的String.format(),简化其过程.他们的作用都在于为字符串提供占位符,并为字符串传入变量. 用法 关于 ...

  2. Kali Linux上外网

    第一部分 攻击者杀链 第一章  走进Kali Linux 镜像准备:32位kali linxu 2019(之前下载好了,按书上的版本太低了要重新配置好多东西就用最新版了) , win XP 前两章照着 ...

  3. 删除文件linux

    bool LxDeleteFile(const char* src){ int32_t iRe = remove(src); ) return true; else return false; }

  4. mysql 事务四要素杂谈

    事务四要素 对于数据库来说,并发性和准确性是数据库需要权衡的两个点. 类似于我们的应用系统,又要要性能还要要准确. 数据准确性这一条来说,最好的控制就是串行化,都别急,一个一个来.这样数据就没问题了. ...

  5. PHP 开发工程师基础篇 - PHP 数组

    数组 (Array) 数组是 PHP 中最重要的数据类型,可以说是掌握数组,基本上 PHP 一大半问题都可以解决. PHP 数组与其他编程语言数组概念不一样.其他编程语言数组是由相同类型的元素(ele ...

  6. SpringCloud微服务(02):Ribbon和Feign组件,实现服务调用的负载均衡

    本文源码:GitHub·点这里 || GitEE·点这里 一.Ribbon简介 1.基本概念 Ribbon是一个客户端的负载均衡(Load Balancer,简称LB)器,它提供对大量的HTTP和TC ...

  7. mysql 数据误删恢复

    当binlog_format设置为ROW时,想查看binlog中的sql语句时,需要解密,添加这个 --base64-output=decode-rows -v

  8. maven仓库之第一篇

    maven jar仓库 :存放maven项目使用的jar包. 中央仓库,存放99%免费开源项目jar包,apache公司负责维护的,以T为单位的存储. 例如 : struts2-core-2.3.24 ...

  9. golang-结构体与指针

    1.结构体 结构体是一系列具有指定数据类型的数据类型 ,就是一个结构体中存储多个不同类型的数据字段 ,用于创建传递复杂数据结构 结构体可以理解为面向对象的模板 ,但是go并非面向对象 ,结构体只是一种 ...

  10. 松软科技web课堂:SQLServer之LAST() 函数

    LAST() 函数 LAST() 函数返回指定的字段中最后一个记录的值. 提示:可使用 ORDER BY 语句对记录进行排序. SQL LAST() 语法 SELECT LAST(column_nam ...