Two Paths
http://acm.hdu.edu.cn/showproblem.php?pid=6181
次短路(代码上网搜的模板)。。。开始INF=le9一直超时,看到评论区有人讨论,改为le18就过了。。。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#define LL long long
#define MAXN 100005
#define INF 1e18
using namespace std;
struct node
{
LL v, w, next;
} edge[MAXN * 2];
LL n, m, e, p, q;
LL vis[MAXN], dis[MAXN], disr[MAXN], head[MAXN];
void insert(LL x, LL y, LL w)
{
edge[e].v = y;
edge[e].w = w;
edge[e].next = head[x];
head[x] = e++;
}
void spfa(LL src, LL d[])
{
memset(vis, 0, sizeof(vis));
vis[src] = 1;
d[src] = 0;
queue<LL> Q;
Q.push(src);
while(!Q.empty())
{
p = Q.front();
Q.pop();
vis[p] = 0;
for(LL i = head[p]; i != -1; i = edge[i].next)
{
LL v = edge[i].v;
LL w = edge[i].w;
if(d[v] > d[p] + w)
{
d[v] = d[p] + w;
if(!vis[v])
{
vis[v] = 1;
Q.push(v);
}
}
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
LL a, b,c;
scanf("%lld%lld", &n, &m);
e = 0;
memset(head, -1, sizeof(head));
memset(dis, 0x3f, sizeof(dis));
memset(disr, 0x3f, sizeof(dis));
for(LL i = 0; i < m; i++)
{
scanf("%lld%lld%lld", &a, &b, &c);
insert(a, b, c);
insert(b, a, c);
}
spfa(1, dis);
spfa(n, disr);
LL mini = dis[n];
LL ans = INF;
for(LL i = 1; i <= n; i++)
{
for(LL j = head[i]; j != -1; j = edge[j].next)
{
LL v = edge[j].v;
LL w = edge[j].w;
if(dis[i] + disr[v] + w > mini && dis[i] + disr[v] + w < ans)
ans = dis[i] + disr[v] + w;
}
}
printf("%lld\n",ans);
}
return 0;
}