最短路 & 次短路
来源:互联网 发布:如何禁止用户安装软件 编辑:程序博客网 时间:2024/04/30 21:05
代码:
int dij(){ int i, j, vis[N]; for(i = 1; i <= n; i++) vis[i] = mp[1][i]; vis[1] = 0; for(i = 1; i <= n; i++) { int m = 1, f = inf; for(j = 1; j <= n; j++) { if(f > vis[j] && !book[j]) { m = j; f = vis[j]; } } book[m] = 1; for(j = 1; j <= n; j++) { if(!book[j] && vis[j] > vis[m] + mp[m][j]) vis[j] = vis[m] + mp[m][j]; } } return vis[n];}//n*log(n)struct edge {int to, cost; };typedef pair<int, int> P; // first 是最短距离,second是顶点编号int V;vector<edge> G[Max_V];int d[Max_V];void dijkstra(int s){ //通过指定greater<P>参数,堆按照first从小到大的循序取出值 priority_queue<P, vector<P>, greater<P> > que; fill(d, d + V, INF); d[s] = 0; que.push(P(0, s)); while(!que.empty()) { P p = que.top(); que.pop(); int v = p.second; if(d[v] < p.first) continue; for(int i = 0; i < G[v].size(); i++) { edge e = G[v][i]; if(d[e.to] > d[v] + e.cost) { d[e.to] = d[v] + e.cost; que.push(P(d[e.to], e.to)); } } }}// Bellman_Fond复杂度O(VE)struct edge {int from, to, cost; };edge es[Max_E];int d[Max_V];int V, E;void shortest_path(int s){ for(int i = 0; i < V; i++) d[i] = INF; d[s] = 0; while(true) { bool update = false; for(int i = 0; i < E; i++) { edge e = es[i]; if(d[e.from != INF && d[e.to] > d[e.from] + e.cost) { d[e.to] = d[e.from] + e.cost; update = true; } } if(!update) break; }}//开始时判断重边bool find_negative_loop(){ memset(d, 0, sizeof(d)); for(int i = 0; i < V; i++) { for(int j = 0; j < E; j++) { edge e = es[j]; if(d[e.to] > d[e.from] + e.cost) { d[e.to] = d[e.from] + e.cost; if(i == V - 1) return false; } } } return true;}
次短路:
#include <cstdio>#include <cstring>#include <queue>#include <algorithm>using namespace std;const int MAXN = 100009;const int INF = 0x3f3f3f3f;typedef long long LL;struct edge{ int to, cost; edge(int tv = 0, int tc = 0): to(tv), cost(tc) {}};typedef pair<LL,int> P;int N, R;vector<edge> graph[MAXN];LL dist[MAXN];LL dist2[MAXN];void solve(){ memset(dist, 0x3f, sizeof(dist)); memset(dist2, 0x3f, sizeof(dist2)); priority_queue<P, vector<P>, greater<P> > Q; dist[1] = 0ll; Q.push(P(0, 1)); while(!Q.empty()) { P p = Q.top(); Q.pop(); int v = p.second; LL d = p.first; if(dist2[v] < d) continue; for(unsigned i = 0; i < graph[v].size(); i++) { edge &e = graph[v][i]; LL d2 = d + e.cost; if(dist[e.to] > d2) { swap(dist[e.to], d2); Q.push(P(dist[e.to], e.to)); } if(dist2[e.to] > d2 && dist[v] < d2) { dist2[e.to] = d2; Q.push(P(dist2[e.to], e.to)); } } } printf("%lld\n", dist2[N]);}int main(){ int A, B, D, t; scanf("%d", &t); while(t--) { scanf("%d%d", &N, &R); for(int i = 1; i <= N; i++) graph[i].clear(); for(int i = 0; i < R; i++) { scanf("%d%d%d", &A, &B, &D); graph[A].push_back(edge(B, D)); graph[B].push_back(edge(A, D)); } solve(); } return 0;}
阅读全文
0 0
- 最短路 & 次短路
- poj3463 最短路+次短路
- 最短路及次短路
- hdu3191 次最短路
- POJ 3463 最短路 次短路
- POJ 3463 Sightseeing 最短路+次短路
- poj 3463 最短路与次短路
- nyoj1006(最短路次短路spfa)
- POJ_3463_Sightseeing(最短路/次短路条数)
- Dijkstra求最短路与次短路
- poj 3255 最短路和次短路
- 1688 Sightseeing(最短路+次短路+计数)
- 最短路和次短路条数
- poj 3463 最短路和次短路
- HDU-1688 Sightseeing(最短路+次短路)
- 路由选择(最短路,次短路,第三短路)
- 次短路
- 次短路
- hdu1257 (找最长不上升子序列的条数)
- get请求中传json参数报400的错误。
- 数论之组合数取模
- 网络概述
- 0.1.2基本数据类型讲解2
- 最短路 & 次短路
- Linux逻辑卷管理
- c|c++ 封装 c# 调用的动态库
- java中socket实现一对一聊天
- hdu5791 Two(dp求公共子序列个数)
- 解决Maven项目No compiler is provided in this environment. Perhaps you are running on a JRE
- eclipse连接自己的手机进行调试
- CentOS-6.5安装tomcat7
- mybatis在xml文件中处理大于号小于号的方法