求解次短路长度,最短路条数
Posted 钟钟终
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求解次短路长度,最短路条数相关的知识,希望对你有一定的参考价值。
求解次短路长度
https://www.luogu.com.cn/problem/P2865
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1e6+5;
struct Edge
int to,nxt,dis;
e[maxn];
int dist[maxn][2],head[maxn],cnt,n,r;
bool vis[maxn];
void add(int from,int to,int w)
e[++cnt].to=to;
e[cnt].dis=w;
e[cnt].nxt=head[from];
head[from]=cnt;
queue<int>q;
void spfa(int u)
memset(dist,inf,sizeof(dist));
vis[u]=1;
dist[u][0]=0;
q.push(u);
while(!q.empty())
int u=q.front();q.pop();
vis[u]=0;
for(int i=head[u];i;i=e[i].nxt)
int v=e[i].to;
if(dist[v][0]>dist[u][0]+e[i].dis)
dist[v][1]=dist[v][0];
dist[v][0]=dist[u][0]+e[i].dis;
if(!vis[v])
vis[v]=1,q.push(v);
if(dist[v][1]>dist[u][0]+e[i].dis&&dist[v][0]<dist[u][0]+e[i].dis)
dist[v][1]=dist[u][0]+e[i].dis;
if(!vis[v])
vis[v]=1,q.push(v);
if(dist[v][1]>dist[u][1]+e[i].dis)
dist[v][1]=dist[u][1]+e[i].dis;
if(!vis[v])
vis[v]=1,q.push(v);
signed main()
scanf("%lld%lld",&n,&r);
for(int i=1;i<=r;i++)
int u,v,w;scanf("%lld%lld%lld",&u,&v,&w);
add(u,v,w);
add(v,u,w);
spfa(1);
cout<<dist[n][1]<<endl;
return 0;
最短路条数
https://www.luogu.com.cn/problem/P1144
再开一个数组ans记录
for(int i=head[u];~i;i=e[i].nxt)
int v=e[i].to;
if(dist[v]>dist[u]+e[i].dis)
dist[v]=dist[u]+e[i].dis;
ans[v]=ans[u];
q.push(nodev,dist[v]);
else if(dist[v]==dist[u]+e[i].dis)
ans[v]+=ans[u];
ans[v]%=mod;
以上是关于求解次短路长度,最短路条数的主要内容,如果未能解决你的问题,请参考以下文章