一、次短路
聽名字也能知道,次短路就是求的第二短的路徑,這裏有兩種解法
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;
}