题目链接


题目大意:

有一城市,这个城市有nnn个地点和mmm条连接他们的路,点的编号是从111到nnn,小X住在111,他想去nnn。
但是最近正在维修公路,也就是说这mmm条路有且只有一条是坏的,但是小X不知道是哪一条,一条很关键的路坏了路程就会增加很多,所以小X想知道从111到nnn 最坏情况下的路程。你能帮助他吗?


解题思路:

  1. 最直接的想法,就是枚举每一条给的路径,把这条路径“删掉",删掉可以把邻接矩阵对应的边赋值为INF,然后依次求最短路。但是所有的边数太多了,有1000*999/2条, 不用想了肯定是超时的。所以选择删哪些边是最重要的。

  2. 只需要先求一次最短路,记录好路径,然后枚举删除这条路径上的边,再求最短路,所有最短路中最大的那个就是答案。这样最多就只需要删除n次就可以了。为什么只要枚举的是最短路上的边就行了呢?很简单,如果枚举的是其他边,那么将会毫无影响,再次进行最短路算法时,得出的还是和原来的最短路一样。记录路径的方法是在松弛的时候用一个数组pre记录。


AC code

#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define f first
#define s second
#define endl '\n'
using namespace std;
const int N = 2e6 + 10, mod = 1e9 + 9;
const int maxn = 1010;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x)
{x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args)
{read(first);read(args...);
}int n, m;
struct node {int nxt, to, w;
}edge[maxn*maxn];
int head[maxn],cnt;
inline void init() {ms(head,-1), cnt;
}
inline void add(int from, int to, int w) {edge[cnt] = {head[from],to, w};head[from] = cnt++;
}
int pre[maxn], dist[maxn], mp[maxn][maxn];
inline void dij(bool flag) {ms(dist,INF);priority_queue<PII,vector<PII>,greater<PII>> heap;heap.push({0,1});dist[1] = 0;while(!heap.empty()) {int ver = heap.top().second;int di = heap.top().first;heap.pop();for(int i = head[ver]; ~i; i = edge[i].nxt) {int v = edge[i].to, w = edge[i].w;if(!flag && mp[ver][v]) continue;if(dist[v] > di + w) {if(flag) pre[v] = ver;dist[v] = di + w;heap.push({dist[v],v});}}}
}
int main() {IOS;while(cin >> n >> m) {init();for(int i = 1; i <= m; ++ i) {int u, v, w;cin >> u >> v >> w;add(u,v,w);add(v,u,w);}dij(1);int poi = n;int ans = 0;while(pre[poi]) {mp[poi][pre[poi]] = mp[pre[poi]][poi] = 1;dij(0);ans = max(ans,dist[n]);mp[poi][pre[poi]] = mp[pre[poi]][poi] = 0;poi = pre[poi];} cout << ans << "\n";}
}

图论500题 ---- 枚举(最短路上的边)+最短路 删掉任意一条边的最长最短路 HDU1595相关推荐

  1. 图论500题 ---- (枚举+并查集)求图上路径权值差值最小 HDU find the most comfortable road

    题目链接 解题思路: 对于两个点的路径假设我们把边按照边权进行排序那么,再把边依次加入图中判断两点的联通性,那么这个边就是两个点联通的最小的最大值,但是最大的最小值怎么找? 因为我们是把边权按照从小到 ...

  2. 【转载】图论 500题——主要为hdu/poj/zoj

    转自--http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...

  3. hdu3986 spfa + 枚举最短路上的边

    题意: 删除一条边后,求最短路中最长的那个(敌人搞破坏). 思路: 如果你是敌人你肯定删除最短路上的边,删除别的边最短路的值是不会变的,所以直接枚举最短路上的边去删除,取得最大的就行了... #inc ...

  4. HDU ACM 3986 Harry Potter and the Final Battle(邻接表实现最短路dijkstra堆优化记录路径 + 枚举最短路上每条边)...

    http://acm.hdu.edu.cn/showproblem.php?pid=3986 题意: 从起点1 到 终点n,删除图中任意一条边求最短路的最坏情况. n  --表示有n个点 m --边数 ...

  5. 图论500题 ---- 并查集+树形dp+枚举 求解动态的最小生成树 HDU 4126

    题目链接 题目大意: 给一图,n个点,m条边,每条边有个花费,给出q条可疑的边,每条边有新的花费,每条可疑的边出现的概率相同,求不能经过原来可疑边(可以经过可疑边新的花费构建的边),注意每次只出现一条 ...

  6. 图论500题 慢慢写

    题目来源 https://blog.csdn.net/ffq5050139/article/details/7832991 这篇博客用来记录自己刷的图论题 先占个坑 所有题目都来自上面的链接 会慢慢更 ...

  7. 图论500题 ---- 并查集求路径上最大值最小不超过K的点对数 HDU Portal

    题目链接 题目大意: 就给你一个图,qqq次询问,问你这个图上有多少对点之间的所以路径上的最大值的最小值不超过kkk? 解题思路: 首先我们知道这本质上就是求两个点联通的路径上的最大值最小是多少? 那 ...

  8. 【图论】最短路上的统计(ssl 1500)

    最短路上的统计 ssl 1500 题目大意: 求一个图中,从a到b的所有最短路所经过的点数之和 原题: 题目描述 一个无向图上,没有自环,所有边的权值均为1,对于一个点对(a,b),我们要把所有a与b ...

  9. 【2015-2016 ACM-ICPC NERC】【F Froggy Ford】【最小生成树】【最短路】【思维好题】【往河中添加一块石头,使得最短路上最大距离最小】

    [题意] 往河中添加一块石头,使得最短路上最大距离最小 [思路] 枚举两个端点,那么某条路的最短路径上的最大距离就是max(dis1[i],dis2[j],dis[i][j]),建立两个虚源模仿最小生 ...

最新文章

  1. python之深浅拷贝
  2. 【js】callback时代的变更
  3. java通过反射,泛型将定义的对象与对象之间互转
  4. Android之一窥究竟Activity间的数据传递以及Intent的用处
  5. 怎样实现前端裁剪上传图片功能
  6. oracle sql statement ignored,sql – Oracle无效使用类型名称或子类型名称
  7. 操作系统:基于页面置换算法的缓存原理详解(上)
  8. 一步一步详解ID3和C4.5的C++实现
  9. 振作起来– Spring Framework 4.0即将来临!
  10. 面试题(C++09:Autodesk)
  11. entity framework扩展实战,小项目重构,不折腾
  12. hibernate一对多双向关联中怎么配置list
  13. 华为奇葩面试题:一头牛重800公斤一座桥承重700公斤,请问牛怎么过桥?
  14. SVN 删除文件及其恢复大全
  15. Xcode5帮助文档!
  16. word利用宏批量调整图片大小
  17. WIndowsServer2012 DHCP服务器配置
  18. nyoj 小明的存钱计划
  19. 计算机大赛获奖作品动画,全国xx杯说课大赛计算机类一等奖作品:《遮罩动画》说课课件...
  20. [Linux学习笔记] 浅谈信号(文章含不少学习资源)

热门文章

  1. 爬虫之selenium对cookie的处理
  2. 由于获得较好的处理机资源,因此将之前的数据整合到一起。
  3. 基于Nginx的LVS配置 提出curl 虚拟IP无响应解决办法!
  4. 程序员必须掌握哪些算法?
  5. 读了那么多CV论文,竟然连车道线分割都实现不了!
  6. excel函数简要使用
  7. 在html中引入css、js和jQuery的方法
  8. php的PDO手记1
  9. vim中权限不足时不用退出而强制保存
  10. getTasksWithCompletionHandler的用法