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

  

posted @ 2018-04-17 12:37  愿~得偿所愿,不负时光  阅读(162)  评论(0编辑  收藏  举报