您的位置:首页 > 其它

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。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: