洛谷P2865 [USACO06NOV]路障Roadblocks 次短路

传送门

到顶点v的次短路有两种情况:

(1)到u的最短路+d(u,v);

(2)到u的次短路+d(u,v);

dis[]表示最短路的数组,dis2[]是次短路的数组,然后用优先队列维护这两个数组

对已经求得的到u的路径长z:

(1)如果z<dis[v]&&z<dis2[v]:把dis2[v]赋值为dis[v],dis[v]赋值为z,dis[v],dis2[v]进队列

(2)如果z<dis2[v]&&z>dis[v]:把dis2[v]更新为z,dis2[v]进队列

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n,m;
const int inf=99999999;
vector<pair<int,int> >g[5005];
priority_queue<pair<int,int> >q;
int book[5005],dis[5005],dis2[5005];
void swap(int &x,int &y)
{
    int t=x;
    x=y;
    y=t;
}
void dijkstra()
{
    int i,t;
    for(i=1;i<=n;i++){
        dis[i]=inf;
        dis2[i]=inf;
    }
    dis[1]=0;
    q.push(make_pair(0,1));
    while(q.size())
    {
        pair<int,int>r=q.top();
        q.pop();
        int x=r.second;
        if(dis2[x]<-r.first)continue;
        for(i=0;i<g[x].size();i++)
        {
            int y,z;
            y=g[x][i].second;
            z=-r.first+g[x][i].first;
            if(z<dis[y]&&z<dis2[y])
            {
                dis2[y]=dis[y];
                dis[y]=z;
                q.push(make_pair(-dis[y],y));
                q.push(make_pair(-dis2[y],y));
            }
            if(z<dis2[y]&&z>dis[y])
            {
                dis2[y]=z;
                q.push(make_pair(-dis2[y],y));
            }
        }
    }
}
void solve()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        g[a].push_back(make_pair(c,b));
        g[b].push_back(make_pair(c,a));
    }
    dijkstra();
    cout<<dis2[n]<<endl;
}
int main()
{
    solve();
}

猜你喜欢

转载自www.cnblogs.com/lyhhahaha/p/10093097.html