poj 3255 次短路
题目大意:
输入点和边的个数n和m,然后输入m条边,每条边包含点l,r和距离c,让你求次短路
基本思路:
堆优化的迪杰斯特拉搞一下,有很多细节需要注意:
1)if(c>diss[v]) 注意这里是>,而不是>=
2)int sumc=c+cc;而不是 int sumc = disf[v]+cc或者 int sumc = diss[v]+cc
3)然后如果sumc也小disf,diss,都要push到优先队列里去
代码如下:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int inf = 0x3f3f3f3f;
const int maxn = 100000+10;
int disf[maxn],diss[maxn];
vector<pii>gra[maxn];
priority_queue<pii,vector<pii>,greater<pii> >pq;
int main(){
int n,m;
cin>>n>>m;
int l,r,c;
for(int i=1;i<=m;i++){
cin>>l>>r>>c;
gra[l].push_back(make_pair(c,r));
gra[r].push_back(make_pair(c,l));
}
memset(disf,inf,sizeof(disf));
memset(diss,inf,sizeof(diss));
disf[1]=0;
diss[1]=inf;
pq.push(make_pair(0,1));
while(!pq.empty()){
pii t=pq.top();
pq.pop();
int c=t.first;
int v=t.second;
if(c>diss[v]){
continue;
}
int sz=gra[v].size();
for(int i=0;i<sz;i++){
pii tt=gra[v][i];
int cc=tt.first;
int vv=tt.second;
int sumc=c+cc;
if(sumc<disf[vv]){
int t=disf[vv];
disf[vv]=sumc;
sumc=t;
pq.push(make_pair(disf[vv],vv));
}
if(sumc>disf[vv]&&sumc<diss[vv]){
diss[vv]=sumc;
pq.push(make_pair(diss[vv],vv));
}
}
}
cout<<diss[n]<<endl;
return 0;
}

浙公网安备 33010602011771号