题目链接
https://loj.ac/p/10076
题目呢就是让求次短路 之前遇到了次小生成树 现在遇到了次短路 学的有点迷
代码
分别求出从1到各个点的最短距离
反向求出n到各个点的最短距离 我们求以x为转折点 从1到x 加上从 x到y 加上从y到n的距离来求 次短路就可以了
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
long long w[201000];//要开的大一点 不要有组数据过不去~
int dis[201010],dis1[201001],n,m,e[201010],f[201010],nx[201100],cnt=0,u[201100],vis[201010];
const int inf=0x3f3f3f3f;
void add(int uu,int v,int ww)
{
u[cnt]=uu;
e[cnt]=v;
nx[cnt]=f[uu];
w[cnt]=ww;
f[uu]=cnt++;
}
void spfa(int x,int *dis)//spfa模板啦
{
int i;
queue<int>q;
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++)
dis[i]=inf;
dis[x]=0;
vis[x]=1;
q.push(x);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=0;
for(i=f[u];~i;i=nx[i])
{
int h=e[i];
int ww=w[i];
if(dis[h]>dis[u]+ww)
{
dis[h]=dis[u]+ww;
if(!vis[h])
{
vis[h]=1;
q.push(h);
}
}
}
}
}
int main()
{
int i,j,a,b,c;
scanf("%d%d",&n,&m);
memset(f,-1,sizeof(f));
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
spfa(1,dis);
spfa(n,dis1);
int l=dis[n];//最短路的大小
// printf("%d++\n",l);
int ll=inf;
for(i=0;i<cnt;i++)//尝试以每一条边作为转折点
{
int uu=u[i];
int v=e[i];
int ww=w[i];
if(dis[uu]+dis1[v]+ww>l)//如果比最短路大 更新次短路的值
{
ll=min(ll,dis[uu]+dis1[v]+ww);
}
}
printf("%lld\n",ll);
return 0;
}