hdu1595find the longest of the shortest 最短路
2015-08-01 11:27
225 查看
//给一个无向图,问删除一条边,使得从1到n的最短路最长 //问这个最长路 //这个删除的边必然在最短路上,如果不在,那么走这条最短路肯定比其他短 //枚举删除这条最短路的边,找其最长的即为答案 #include<cstdio> #include<cstring> #include<iostream> using namespace std ; const int maxn = 1110 ; const int inf = 0x3f3f3f3f; struct Edge { int u , v , w ; int next ; }edge[maxn*maxn] ; int head[maxn] ; int nedge ; int F[maxn] ; int vis[maxn] ; int dis[maxn] ; int a[maxn] ; int n , m; void addedge(int u , int v , int w) { edge[nedge].u = u ; edge[nedge].v = v ; edge[nedge].w = w ; edge[nedge].next = head[u] ; head[u] = nedge++ ; } void dijkstra(int num) { memset(vis , 0 , sizeof(vis)) ; for(int j = 2;j <= n;j++) dis[j] = inf ; dis[1] = 0 ; while(1) { int mi = inf; int pos ; for(int j = 1 ;j <= n;j++) if(!vis[j] && dis[j] < mi) mi = dis[pos = j] ; if(mi == inf)break; vis[pos] = 1 ; for(int i = head[pos] ;i != -1 ;i = edge[i].next) { if(i == num || i == (num^1)) continue ; int v = edge[i].v; if(dis[v] > dis[pos] + edge[i].w) { dis[v] = dis[pos] + edge[i].w ; F[v] = i ; } } } } int main() { //freopen("in.txt" ,"r" , stdin) ; while(~scanf("%d%d" , &n , &m)) { memset(head , -1 , sizeof(head)) ; nedge = 0 ; memset(F , 0 , sizeof(F)) ; while(m--) { int u , v , w ; scanf("%d%d%d" ,&u , &v ,&w) ; addedge(u , v , w) ; addedge(v , u , w) ; } dijkstra(nedge) ; int u = n ; int ans = 0 ; int len = 0 ; while(1) { if(u == 1)break ; a[++len] = F[u] ; u = edge[F[u]].u ; } for(int i = 1;i <= len;i++) { dijkstra(a[i]) ; ans = max(ans , dis ) ; } cout<<ans<<endl; } return 0 ; }
相关文章推荐
- linux -- 个人笔记
- PHP易混淆函数的区分方法及意义
- 设计模式(23) - 命令模式
- Win10版Xbox应用程序更新 提高稳定性和流畅性
- HDU 1069 Monkey and Banana
- C++ 全局变量和局部变量
- JDK,JRE,JVM区别与联系
- 如何搭建一个linux服务器
- 详解JavaScript中的函数声明和函数表达式
- android checkbox 未选中状态 已选中状态 替换成自己的图片
- 【练习笔记】剑指offer-面试题4 :替换空格
- Oracle之DataGurd(DG)环境升级--快捷同步
- HDU5336 XYZ and Drops 暴力模拟
- 轻松java学习之路2
- Ubuntu环境下安装Qt
- I - Caocao's Bridges - hdu 4738(求桥)
- elciple中创建Web工程
- PHP 判断数组是否为空的方法
- Windows下合并tar分卷
- SQL2008 清空数据库中所有表数据的方法