POJ 3255 Roadblocks --次短路径
2014-04-03 09:44
344 查看
由于次短路一定存在,则可知次短路一定是最短路中某一条边不走,然后回到最短路,而且只是一条边,两条边以上不走的话,就一定不会是次短路了(即以边换边才能使最小)。所以可以枚举每一条边,算出从起点到这条边起点的最短距离,以及从终点到这条边终点的最短距离,再加上这条边的权值,看是否是次短路(比最短路总权值大的最小权值的路径)
代码:
View Code
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <vector> #include <map> #include <queue> #define Mod 1000000007 using namespace std; #define N 5007 vector<pair<int,int> > G[200005]; int ds ,dt ,vis ; int n,m,k; void SPFA(int s,int *d) { int i,u,v; queue<int> que; memset(vis,0,sizeof(vis)); d[s] = 0; vis[s] = 1; que.push(s); while(!que.empty()) { v = que.front(); que.pop(); vis[v] = 0; //边允许重复走 for(i=0;i<G[v].size();i++) { u = G[v][i].first; if(d[v] + G[v][i].second < d[u]) { d[u] = d[v] + G[v][i].second; if(!vis[u]) { vis[u] = 1; que.push(u); } } } } } int main() { int u,v,w; int res,tmp,i,j; while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++) G[i].clear(); for(i=1;i<=n;i++) ds[i] = dt[i] = Mod; while(m--) { scanf("%d%d%d",&u,&v,&w); G[u].push_back(make_pair(v,w)); G[v].push_back(make_pair(u,w)); } SPFA(1,ds); SPFA(n,dt); res = Mod; for(i=1;i<=n;i++) for(j=0;j<G[i].size();j++) { u = i; v = G[i][j].first; w = G[i][j].second; tmp = ds[u] + dt[v] + w; if(tmp > ds && res > tmp) res = tmp; } printf("%d\n",res); } return 0; }
View Code
相关文章推荐
- POJ 3255 Roadblocks --次短路径
- POJ 3255 Roadblocks(Dijstra 求次短路长度)
- poj 3255 Roadblocks(无向图次短路 SPFA)
- POJ 3255 Roadblocks (次短路问题)
- poj 3255 Roadblocks
- [POJ 3255]Roadblocks[dijkstra][次短路]
- POJ 3255 Roadblocks 【次短路】
- POJ 3255 Roadblocks
- poj 3255 Roadblocks(spfa次短路 || Dijsktra)
- 【POJ 3255】Roadblocks 【次短路】
- MST:Roadblocks(POJ 3255)
- Roadblocks POJ - 3255 (次段路)
- poj 3255 Roadblocks
- POJ - 3255 - Roadblocks(Dijkstra)
- POJ 3255 Roadblocks(A*求次短路)
- POJ 3255 Roadblocks——次短路
- POJ - 3255 Roadblocks —— 次短路
- POJ3255-Roadblocks-dijkstra求次短路
- POJ——T 3255 Roadblocks|| COGS——T 315. [POJ3255] 地砖RoadBlocks || 洛谷—— P2865 [USACO06NOV]路障Roadblocks
- POJ 3255 - Roadblocks(次短路)