洛谷 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(最短路)的更多相关文章
- 洛谷P1144 最短路计数(SPFA)
To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M ...
- 洛谷 1144 最短路计数 bfs
洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移, ...
- 洛谷 P2384 最短路
洛谷 P2384 最短路 题目背景 狗哥做烂了最短路,突然机智的考了Bosh一道,没想到把Bosh考住了...你能帮Bosh解决吗? 他会给你10000000000000000000000000000 ...
- 洛谷2483 k短路([SDOI2010]魔法猪学院)
题目请戳这里 一句话题意: 给你一张n个节点,m条单向边的图,求1到n第k短的路. emmm,纪念第一个黑题(我是真的菜啊!!) 这题目还是很难的,本蒟蒻只会被洛谷卡掉的A(所以就愉快地特判了),首先 ...
- 洛谷——P2176 [USACO14FEB]路障Roadblock
P2176 [USACO14FEB]路障Roadblock 题目描述 每天早晨,FJ从家中穿过农场走到牛棚.农场由 N 块农田组成,农田通过 M 条双向道路连接,每条路有一定长度.FJ 的房子在 1 ...
- 洛谷 P1144 最短路计数 Label:水
题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行 ...
- 洛谷P1144最短路计数题解
最短路计数 此题还是寻找从1到i点总共有几个最短路且每条边的边长为1,对于这种寻找最短路的个数,我们可以反向搜索,即先用\(SPFA\)预处理出所有点的最短路,然后我们反向记忆化搜索,可以用\(sum ...
- 洛谷P1144 最短路计数
题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行 ...
- 洛谷 P1144 最短路计数
传送门:https://www.luogu.org/problemnew/show/P1144 这虽然是一道普及+的题,然而我发现我现在还没做过,这也就直接导致我今天模拟T2只杠了个暴力分…… 那这道 ...
随机推荐
- 22(8).模型融合---RegionBoost
在adaboost当中,样本的权重alpha是固定的,蓝色五角星所在的圈中3个○分错了,红色五角星所在的圈中4个×和1个○都分对了,很容易让人想到,这个模型,对于红色位置的判断更加可信. 动态权重,每 ...
- mysql8安装后如何修改root密码
mysql5.7.9之后,就没有了password函数,所以,使用传统的password()函数修改root密码的话,就会提示sql错误 UPDATE user SET authentication_ ...
- go语言之goto语句和函数和defer语句
1.goto关键字 import "fmt" func main() { for i := 0;i <11;i++{ if i == 2{ //关键字,goto跳转到某个位置 ...
- 如何优雅规避NPE
项目中尤其是在持久层,难免会有大量的针对集合,对象,字符串的操作,为了程序的健壮性,我们不得不进行判空,像下面箭头式编码吗? if(null!=person){ ... if(null!=addres ...
- synchronized&volatile
synchronized(JVM实现的锁) 通过这两个关键字,我们可以很容易的实现同步多个任务的行为,可以实现同一时刻,只能有一条线程去访问共享资源 一: 修饰普通方法 多个线程,共同去竞争访问,方法 ...
- PAT 1009 Product of Polynomials 模拟
This time, you are supposed to find A*B where A and B are two polynomials. Input Specification: Each ...
- ASP.NET MVC教程五:ASP.NET MVC中的路由
一.概述 在ASP.NET MVC架构中,控制器在3大核心构件中处于中心地位,通过控制器支配模型和视图,然而从浏览器发出的请求到控制器还需要路由的协助,路由将特定的请求和控制器的动作对应起来. 在AS ...
- 轻松搞定项目中的空指针异常Caused by: java.lang.NullPointerException: null
大家在项目测试过程中,是不是经常会碰到这个空指针异常呢Caused by: java.lang.NullPointerException: null 当大家遇到这个问题,大家是怎么处理?自己解决还是让 ...
- R Data Frame
https://www.datamentor.io/r-programming/data-frame/ Check if a variable is a data frame or not We ca ...
- Mongodb介绍(非原创)
文章大纲 一.什么是nosql二.mongodb与mysql比较三.参考文章 一.什么是nosql 1. 简介 这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据. ...