hdu1595(枚举+最短路,Dijkstra/SPFA)
来源:互联网 发布:呼叫中心软件系统 编辑:程序博客网 时间:2024/04/27 07:58
题目链接:hdu1595
Dijkstra:515MS
/*题意: 求删掉任意一条边的最长最短路思路: 首先求出最短路,同时记录下路径,接着枚举最短路上每一条边(将此边切段),在求最短路,求这些最短路中的最长路*/#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <map>#include <queue>using namespace std;const int inf = 0x3f3f3f3f;const int MAX = 1005;const int MAXE = 5*1e5;int mp[MAX][MAX];int dis[MAX];bool use[MAX];int pre[MAX];int ans, n;void Dijkstra(int s,int e,bool flag){ typedef pair<int, int > pii; priority_queue< pii, vector<pii>, greater<pii> > q; fill(dis, dis+n+1, inf); dis[s] = 0; if(flag) pre[s] = -1; q.push(make_pair(dis[s],s)); while(!q.empty()) { pii tmp = q.top(); q.pop(); int u = tmp.second; if(tmp.first != dis[u]) continue; for(int v = 1; v <= n; v ++) { if(mp[u][v] && dis[v] > dis[u] + mp[u][v]) { dis[v] = dis[u] + mp[u][v]; if(flag) pre[v] = u; q.push(make_pair(dis[v],v)); } } } if(flag) return; if(dis[e] < inf) ans = max(ans, dis[e]);}void solve(){ int e = n; while(pre[e] != -1)//枚举每条边 { int tmp = mp[e][pre[e]]; mp[e][pre[e]] = mp[pre[e]][e] = 0;//将两边关系切断 Dijkstra(1, n, false); mp[e][pre[e]] = mp[pre[e]][e] = tmp; e = pre[e]; } printf("%d\n",ans);}int main(){ int m; while(~scanf("%d%d",&n,&m)) { int u, v, c; memset(mp, 0, sizeof(mp)); while(m--) { scanf("%d%d%d",&u,&v,&c); mp[u][v] = mp[v][u] = c; } ans = 0; Dijkstra(1, n, true); solve(); } return 0;}
SPFA:4484MS
#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <map>#include <queue>using namespace std;const int inf = 0x3f3f3f3f;const int MAX = 1005;const int MAXE = 5*1e5;const int N = 1005;int mp[N][N];int dis[MAX];bool use[MAX];int pre[MAX];int ans, n;void SPFA(int s, int e, bool flag){ fill(dis, dis+n+1, inf); fill(use, use+n+1, false); queue<int> q; dis[s] = 0; if(flag) pre[s] = -1; use[s] = true; q.push(s); while(!q.empty()) { int u = q.front(); q.pop(); use[u] = false; for(int v = 1; v <= n; v ++) { if(mp[u][v] && dis[v] > dis[u] + mp[u][v]) { dis[v] = dis[u] + mp[u][v]; if(flag) pre[v] = u; if(!use[v]) { use[v] = true; q.push(v); } } } } if(flag) return; if(dis[e] < inf) ans = max(ans, dis[e]);}void solve(){ int e = n; while(pre[e] != -1) { int tmp = mp[e][pre[e]]; mp[e][pre[e]] = mp[pre[e]][e] = 0; SPFA(1, n, false); mp[e][pre[e]] = mp[pre[e]][e] = tmp; e = pre[e]; } printf("%d\n",ans);}int main(){ int m; while(~scanf("%d%d",&n,&m)) { int u, v, c; memset(mp, 0, sizeof(mp)); while(m--) { scanf("%d%d%d",&u,&v,&c); mp[u][v] = mp[v][u] = c; } ans = 0; SPFA(1, n, true); solve(); } return 0;}
0 0
- hdu1595(枚举+最短路,Dijkstra/SPFA)
- HDU1595(枚举+最短路(dijkstra))
- 最短路(dijkstra、spfa)
- HDU 2544 最短路 (Dijkstra || SPFA)
- hdu 2544 最短路(dijkstra||spfa)
- 最短路模板(SPFA+dijkstra)
- 第一周---最短路(Dijkstra、SPFA)
- HDU1595 find the longest of the shortest(最短路,Dijkstra)
- HDU2544:最短路【Dijkstra & SPFA】
- 最短路 spfa, dijkstra, Floyd
- 最短路spfa dijkstra模板
- HDU2544:最短路(Dijkstra,SPFA)
- 最短路【dijkstra】【floyd 】【spfa】
- ZOJ-2008-一个最短路问题-(dijkstra+heap,spfa)
- 最短路算法详解(Dijkstra/SPFA/Floyd)
- HDU-#2544 最短路(Dijkstra、Floyd、Bellman-Ford、SPFA)
- HDOJ 2066 一个人的旅行 (最短路 Dijkstra && SPFA)
- HDOJ 2112 HDU Today (最短路 Dijkstra && SPFA)
- 【小白笔记】PHP学习之路 (16) --数组(增删、获取元素)
- 猜数字游戏
- 控件之---Edit Control
- 关于C#中timer类
- poj2513字典树+欧拉图判断+并查集断连通
- hdu1595(枚举+最短路,Dijkstra/SPFA)
- 算法 结点对的最短路径算法之Floyd-Warshall
- 行人检测(一)hog
- 调整音频参数
- 一些学习到的矩阵运算的模板(T_T)
- catch和throw同时使用---通过多个方法协作处理同一个异常
- shell总结
- Fragment的onCreate和onCreateView的区别?
- 黑马程序员_考生成绩管理系统