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; }