次短路

一、次短路

聽名字也能知道,次短路就是求的第二短的路徑,這裏有兩種解法

1、A*,上一篇博客寫的就是關於A*的,A*用來求第k短的路徑,當k==2時,即爲次短路。

這裏就不多敘述

2、其實就是在最短路上稍微修改一點點就好啦......

即將dis數組改爲二維,dis[i][0]表示到i點的最短路,dis[i][1]表示到i點的次短路,然後每次比較更新每個點的兩個值即可

二、

這裏用poj3255作爲例題給出模板

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define exp 1e-8
#define mian main
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ll long long
#define pb push_back
#define PI  acos(-1.0)
#define inf 0x3f3f3f3f
#define w(x) while(x--)
#define int_max 2147483647
#define lowbit(x) (x)&(-x)
#define gcd(a,b) __gcd(a,b)
#define pq(x)  priority_queue<x>
#define ull unsigned long long
#define sc(x) scanf("%d",&x)
#define scl(x) scanf("%lld",&x)
#define pl(a,n) next_permutation(a,a+n)
#define ios ios::sync_with_stdio(false)
#define met(a,x) memset((a),(x),sizeof((a)))
using namespace std;
const int N=1e5+10;
int n,m,s,t;
struct node
{
    int v,c;
    node(int _v,int _c):v(_v),c(_c){}
    bool operator <(const node &p)const
    {
        return c>p.c;
    }
};
struct edge
{
    int v,cost;
    edge(int _v,int _cost):v(_v),cost(_cost){}
};
vector<edge>e[N];
int dis[N][2];
void add(int u,int v,int w)
{
    e[u].push_back(edge(v,w));
}
void dj()
{
    met(dis,inf);
    dis[s][0]=0;
    priority_queue<node>q;
    while(!q.empty())
        q.pop();
    q.push(node(s,0));
    node tmp(0,0);
    while(!q.empty()){
        tmp=q.top();
        q.pop();
        int u=tmp.v;
        if(dis[u][1]<tmp.c)   //剪枝,跟最短路中vis數組作用一樣
            continue;
        for(int i=0;i<e[u].size();i++){
            int v=e[u][i].v;
            int cost=e[u][i].cost;
            int d=tmp.c+cost;
            if(dis[v][0]>d){
                swap(dis[v][0],d);
                q.push(node(v,dis[v][0]));
            }
            if(dis[v][1]>d&&dis[v][0]<d){
               dis[v][1]=d;
                q.push(node(v,dis[v][1]));
            }
        }
    }
}
int main()
{
    while(cin>>n>>m)
    {
        int x,y,z;
         for(int i=1;i<=n;i++)
           e[i].clear();
        for(int i=0;i<m;i++){
            scanf("%d%d%d",&x,&y,&z);
            add(x,y,z);
            add(y,x,z);
        }
        s=1,t=n;
         dj();
        cout<<dis[t][1]<<endl;
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章