题意:次短路
雾草.....当时卡了好久呢
题解:开两个数组,dist用来储存第一次到达某个点的距离,dist2用来储存第二次到达某个点的距离,然后当到达某个点的距离既大于dist[i]和dist2[i]时就抛弃它,另外注意这个图中允许重复到达某个点
比如
1 2 100
2 3 200
那么1-3的次短路就是1->2->1->2->3
代码如下:
#include <stdio.h>
#include <algorithm>
#include <queue>
#include <vector>
#include <iostream>
#include <string.h>
using namespace std;
#define maxn 5010
#define inf 1e9
struct node{
int to,cost;
};
typedef pair<int,int>p;
priority_queue<p,vector<p>,greater<p> >q;
int dist[maxn],dist2[maxn],n,r;
vector<node>Map[maxn];
void slove(){
p dian;
dian.first=0,dian.second=0;
q.push(dian);
dist[0]=0;
while(!q.empty()){
dian=q.top();
q.pop();
//if(dist2[dian.first]<dian.second)continue;
for(int i=0;i<Map[dian.first].size();i++){
node DIAN=Map[dian.first][i];
int d=dian.second+DIAN.cost;
if(dist[DIAN.to]>d){
swap(dist[DIAN.to],d);
q.push(p(DIAN.to,dist[DIAN.to]));
}
if(dist2[DIAN.to]>d && dist[DIAN.to]<d){
dist2[DIAN.to]=d;
q.push(p(DIAN.to,dist2[DIAN.to]));
}
}
}
if(n==1)dist2[n-1]=0;
printf("%d\n",dist2[n-1]);
}
int main(){
scanf("%d%d",&n,&r);
fill(dist,dist+n,inf);
fill(dist2,dist2+n,inf);
for(int i=1;i<=r;i++){
node now;
int from;
scanf("%d%d%d",&from,&now.to,&now.cost);
from--;
now.to--;
Map[from].push_back(now);
swap(from,now.to);
Map[from].push_back(now);
}
slove();
}