思路:
裸的次短路题,多校的时候直接网上找了个模板,改了改范围和变量类型就1a了,看来很好用,直接盗取了=。=
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#include <vector>
#include <queue>
#define MEM(a,x) memset(a,x,sizeof a)
#define eps 1e-8
#define MOD 10009
#define MAXN 100010
#define MAXM 100010
#define INF 0x3f3f3f3f
#define INFF 0x3f3f3f3f3f3f3f3f
#define ll long long
#define bug cout<<"here"<<endl
#define fread freopen("ceshi.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)
using namespace std;
struct Edge
{
int v,next;
ll w;
}edge[MAXM*2];
ll d[MAXN],rd[MAXN];
int tot,head[MAXN];
int vis[MAXN];
int n,m;
void init()
{
tot=0;
MEM(head,-1);
for(int i=0;i<=n;i++)
d[i]=rd[i]=INFF;
}
void addedge(int u,int v,ll w)
{
edge[tot].v=v;
edge[tot].w=w;
edge[tot].next=head[u];
head[u]=tot++;
}
void SPFA(int s,ll dis[])
{
int u,v;
queue<int> q;
MEM(vis,0);
dis[s]=0; vis[s]=1;
q.push(s);
while(!q.empty())
{
u=q.front(); q.pop();
vis[u]=0;
for(int i=head[u];i!=-1;i=edge[i].next)
{
v=edge[i].v;
if(dis[u]+edge[i].w<dis[v])
{
dis[v]=dis[u]+edge[i].w;
if(!vis[v])
{
vis[v]=1;
q.push(v);
}
}
}
}
}
int main()
{
// fread;
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
init();
while(m--)
{
int u,v;
ll w;
scanf("%d%d%lld",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
SPFA(1,d);
SPFA(n,rd);
ll ans=INFF;
for(int i=1;i<=n;i++)
{
for(int j=head[i];j!=-1;j=edge[j].next)
{
int v=edge[j].v;
ll w=edge[j].w;
ll tmp=d[i]+rd[v]+w;
if(tmp>d[n]&&ans>tmp)
ans=tmp;
}
}
printf("%lld\n",ans);
}
return 0;
}