求解次短路长度,最短路条数

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;
            
        

以上是关于求解次短路长度,最短路条数的主要内容,如果未能解决你的问题,请参考以下文章

最短路径条数问题

POJ 3463 Sightseeing

HDU 1688 Sightseeing 输出最短路+次短路条数

luoguP1144最短路计数

POJ 3463 Sightseeing

POJ 3463 最(次)短路条数