dijkstra模板

Posted aiahtwo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dijkstra模板相关的知识,希望对你有一定的参考价值。

题目链接:

https://nanti.jisuanke.com/t/41349

代码:

#include<bits/stdc++.h>
#define LL long long
#define Mixsum 1000000 //最大边数 
#define Mixn 10000 //最大点数 
using namespace std;
int n,m,s,k,c;//分别表示点的个数、有向边的个数
int S;//起点 
int K[1010];
LL len[1010];
LL dis[Mixn+100];//表示存入的已经求得最短路的点
LL ff[1010][1010];
bool vis[Mixn+100];//防止走多次 
struct Node
    int to,next;
    LL w;
edge[Mixsum+100];//存双向边要乘以2 
int cnt;
int head[Mixn+100];//存点 
void add(int p,int q,int w)
    edge[cnt].to=q;
    edge[cnt].next=head[p];
    edge[cnt].w=w;
    head[p]=cnt++;

struct Jie
    LL fi;
    int se;//se为边的尾结点,fi为权值 
    bool operator < (const Jie &a)const 
        return fi > a.fi;         // 从小到大  ,x小的优先级别高
    
;
void dijkstra()
    for(int i=1;i<=n;i++)
        dis[i]=2e9;//初始化,非常重要 ,一些题目可能要初始化多次 
     
    priority_queue<Jie>q;//优先队列
    memset(vis,false,sizeof(vis)); 
    dis[S] = 0;
    Jie n1;
    n1.fi = 0;//权值 
    n1.se = S;//后点 
    q.push(n1);
    while (!q.empty())
    
        Jie n2 = q.top();
        int now = n2.se;
        q.pop();
        if(vis[now])//如果走过,直接跳过 
            continue;
        
        vis[now]=true;
        for (int i = head[now]; ~i; i = edge[i].next)
        
            LL c = dis[now] + edge[i].w;
            int d = edge[i].to;
            if (c < dis[d])
            
                dis[d] = c;
                Jie n3;
                n3.fi = dis[d];
                n3.se = d;
                q.push(n3);
            
        
    

int main()
    int t;
    scanf("%d",&t);
    while(t--)
    cnt=0;
    memset(head,-1,sizeof(head));
    memset(ff,0,sizeof(ff));
    scanf("%d%d%d%d%d",&n,&m,&s,&k,&c);//先输入n,在初始化 
    for(int i=1;i<=n;i++) len[i]=2e9;
    for(int i=1;i<=k;i++) scanf("%d",&K[i]);//起点
    int p,q;
    LL w;
    for(int i=1;i<=m;i++)
        scanf("%d%d%lld",&p,&q,&w);
        if(ff[p][q]==0)
            add(p,q,w);
            add(q,p,w);
            ff[p][q]=w;
            ff[q][p]=w;
        
        else
            if(ff[p][q]>w)
            add(p,q,w);
            add(w,p,q);
            ff[p][q]=w;
            ff[q][p]=w;    
            
        
    
    LL M1=0,M2=0;
    for(int i=1;i<=k;i++)
        S=K[i];
        dijkstra();
        for(int j=1;j<=n;j++)
            if(dis[j]!=2e9) len[j]=min(len[j],dis[j]);
        
    
    for(int i=1;i<=n;i++)
        if(len[i]!=2e9) M1=max(len[i],M1);
    
    S=s;
    dijkstra();
    for(int i=1;i<=n;i++)
        //cout<<dis[i]<<endl;
        if(dis[i]!=2e9) M2=max(M2,dis[i]);
    
    //cout<<M1<<" "<<M2<<endl; 
    if(M1*(LL)c>=M2)
        printf("%lld\n",M2);
    
    else
        printf("%lld\n",M1);
    
    
    return 0; 

 

以上是关于dijkstra模板的主要内容,如果未能解决你的问题,请参考以下文章

AcWing 850. Dijkstra求最短路 II(Dijkstra稠密图堆优化模板)

[模板]Dijkstra

算法模板之Dijkstra

Dijkstra模板

训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)

Dijkstra模板