Description
给出一张无向图,边有边权,无重边无自环,求 1 1 到的一条次短路
Input
第一行一整数 T T 表示用例组数,每组用例首先输入两个整数和 m m 表示点数和边数,之后行每行三个整数 u,v,w u , v , w 表示 u u 和之间有一条边权为 w w 的边
Output
输出次短路长度
Sample Input
2
3 3
1 2 1
2 3 4
1 3 3
2 1
1 2 1
Sample Output
5
3
Solution
Dijkstra D i j k s t r a 维护最短路和次短路即可
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<ll,int>P;
#define INF 1e15
#define maxn 100005
struct edge
{
int to,cost;
};
vector<edge>g[maxn];
int T,n,m;
ll dis1[maxn],dis2[maxn];
void init()
{
for(int i=1;i<=n;i++)g[i].clear();
}
void add(int u,int v,int c)
{
g[u].push_back((edge){v,c});
}
void Dijkstra(int s)
{
priority_queue< P,vector<P>,greater<P> >que;
for(int i=1;i<=n;i++)dis1[i]=dis2[i]=INF;
dis1[s]=0;
que.push(P(0,s));
while(!que.empty())
{
P p=que.top();
que.pop();
int v=p.second;
if(dis2[v]<p.first) continue;
for(int i=0;i<g[v].size();i++)
{
edge e=g[v][i];
ll d=p.first+e.cost;
if(dis2[e.to]>d)
{
dis2[e.to]=d;
que.push(P(dis2[e.to],e.to));
}
if(dis2[e.to]<dis1[e.to])swap(dis2[e.to],dis1[e.to]);
}
}
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
init();
while(m--)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w),add(v,u,w);
}
Dijkstra(1);
printf("%I64d\n",dis2[n]);
}
}