poj 3255 Roadblocks
2014-11-13 15:13
351 查看
题意:一个无向图,求1~n的严格次短路。
思路:Kruskal算法改进。假设点x是与n连接的某个点,1-n的次短路要么是点1到相异于1-n最短路径上n的前驱的一个节点x的最短路+xn,要么是1-x最短路+xn。
思路:Kruskal算法改进。假设点x是与n连接的某个点,1-n的次短路要么是点1到相异于1-n最短路径上n的前驱的一个节点x的最短路+xn,要么是1-x最短路+xn。
#include<iostream> #include<cmath> #include<queue> #include<vector> #include<algorithm> #include<string.h> #include<cstdio> using namespace std; #define pii pair<int,int> #define INF 100000000 struct edge{ int u,v,cost; edge(int a,int b,int c){ u=a; v=b; cost=c; } }; vector<edge> G[5010]; int dist[5010]; int dist2[5010]; int main(){ int n,m; cin>>n>>m; for(int i=1;i<=n;i++){ dist[i]=INF; dist2[i]=INF; } dist[1]=0; for(int i=1;i<=m;i++){ int u,v,cost; scanf("%d%d%d",&u,&v,&cost); G[u].push_back(edge(u,v,cost)); G[v].push_back(edge(v,u,cost)); } priority_queue<pii,vector<pii>,greater<pii> > que; //小顶堆 que.push(pii(0,1)); while(!que.empty()){ pii cur=que.top(); que.pop(); int u=cur.second; if(dist2[u]<cur.first)continue; int siz=G[u].size(); for(int i=0;i<siz;i++){ int& v=G[u][i].v; int tmpd=cur.first+G[u][i].cost; //这里要注意不能是dist[v]+... if( tmpd < dist[v] ){ swap(dist[v],tmpd); que.push(pii(dist[v],v)); } if( dist2[v]>tmpd && tmpd>dist[v] ){ dist2[v]=tmpd; que.push(pii(dist2[v],v)); } } } cout<<dist2 <<endl; return 0; }
相关文章推荐
- poj 3255 Roadblocks
- Roadblocks(poj 3255)
- poj 3255 Roadblocks
- POJ 3255 Roadblocks——次短路
- POJ 3255 Roadblocks --次短路径
- MST:Roadblocks(POJ 3255)
- POJ 3255 Roadblocks --次短路径
- poj 3255 Roadblocks(spfa次短路 || Dijsktra)
- POJ 3255 Roadblocks(A*求次短路)
- POJ——T 3255 Roadblocks|| COGS——T 315. [POJ3255] 地砖RoadBlocks || 洛谷—— P2865 [USACO06NOV]路障Roadblocks
- POJ - 3255 Roadblocks —— 次短路
- poj 3255 Roadblocks(无向图次短路 SPFA)
- poj-3255 Roadblocks ***
- 【POJ 3255】Roadblocks 【次短路】
- POJ 3255 Roadblocks Dijkstra 算法变形
- POJ 3255 Roadblocks
- POJ 3255 Roadblocks (次短路问题)
- POJ - 3255 - Roadblocks(Dijkstra)
- POJ 3255 Roadblocks(Dijstra 求次短路长度)
- POJ 3255 Roadblocks(Dijkstra)