最短路模板

SPFA(SLF+LLL)

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
const int N = 1e6+10,INF=0x3f3f3f3f;
int head[N],n,m,dis[N],cnt,ans[N],vis[N];
long long sum;
struct node{

    int to,Next,w;

}ed[N];
void init(){

    memset(head,-1,sizeof head);
    memset(dis,INF,sizeof dis);
    memset(ans,0,sizeof ans);
    memset(vis,0,sizeof vis);
    cnt=0;
}
void add(int u,int v,int w){

    ed[cnt].to=v;
    ed[cnt].Next=head[u];
    ed[cnt].w=w;
    head[u]=cnt++;

}
bool SPFA(){

    deque<int> q;
    q.push_back(1),dis[1]=0,vis[1]=1;
    sum=dis[1],cnt=1;
    while(q.size()){
        int u=q.front();
        if(dis[u]*cnt>sum){
            q.pop_front();
            q.push_back(u);
            u=q.front();
        }
        q.pop_front();
        sum-=dis[u];cnt--;
        vis[u]=0;
        for(int i =head[u];~i;i=ed[i].Next){
            int t=ed[i].to;
            if(dis[t]>dis[u]+ed[i].w){
                dis[t]=dis[u]+ed[i].w;
                if(!vis[t]){
                    if(q.empty()||dis[t]>dis[q.front()]){
                        q.push_back(t);
                    }
                    else q.push_front(t);
                    cnt++;
                    sum+=dis[t];
                    if(++ans[t]>n) return false;
                    vis[t]=1;
                }
            }
        }
    }
    return true;
}
int main()
{
    while(scanf("%d %d",&m,&n)!=EOF){
        init();
        for(int i = 0 ; i < m ;i++){
            int u,v,w;
            scanf("%d %d %d",&u,&v,&w);
            add(u,v,w);
            add(v,u,w);
        }
        bool f=SPFA();
        if(f)   printf("%d\n",dis[n]);
        else    printf("NO\n");
    }
    return 0;

}

dijkstra(朴素)

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
const int INF=0x3f3f3f3f;
int e[1100][1100],n,m,dis[1100];
bool vis[1100];
void init(){

    memset(dis,0,sizeof dis);
    memset(vis,0,sizeof vis);
    memset(e,0,sizeof e);/更改/

}
void get_st(){

    for(int i = 0 ; i < m ; i++){
        int u,v,w;
        scanf("%d %d %d",&u,&v,&w);
        e[u][v]=e[v][u]=max(e[u][v],w);
    }

}
void dijkstra(){

    for(int i = 1;i<=n;i++){
        dis[i]=e[1][i];
    }
    vis[1]=1;
    for(int t = 1 ; t <= n ; t++){
        int k=-1;
        for(int i = 1 ; i <= n ; i++){
            if(!vis[i]&&(k==-1||dis[i]>dis[k])){/更改/
                k=i;
            }
        }
        vis[k]=1;
        for(int i = 1; i <= n ; i++){
            if(!vis[i]&&dis[i]<min(dis[k],e[k][i])){/更改/
                dis[i]=min(dis[k],e[k][i]);
            }
        }
    }
}
int main()
{
    int cases;
    while(scanf("%d",&cases)!=EOF){
        int cnt=1;
        while(cases--){
            scanf("%d %d",&n,&m);
            init();
            get_st();
            dijkstra();
            printf("Scenario #%d:\n",cnt++);
            printf("%d\n\n",dis[n]);
        }
    }

    return 0;
}

#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdio.h>
#include <queue>
#include <vector>
using namespace std;
typedef pair<int,int>PII;
const int N = 1e6+10,INF=0x3f3f3f3f;
struct node{

    int to,Next,w;

}ed[N];
int n,m,dis[N],head[N],cnt,S,E;
bool vis[N];
void init(){

    memset(vis,false,sizeof vis);
    memset(head,-1,sizeof head);
    memset(dis,INF,sizeof dis);

}
void add(int u,int v, int w){

    ed[cnt].to=v;
    ed[cnt].w=w;
    ed[cnt].Next=head[u];
    head[u]=cnt++;

}
void dijkstra(){

    priority_queue<PII,vector<PII>,greater<PII> >q;
    dis[S]=0;
    q.push(make_pair(0,S));
    while(q.size()){
        PII tem=q.top();
        int u=tem.second;
        q.pop();
        if(dis[u]<tem.first) continue;
        for(int i = head[u];i!=-1;i=ed[i].Next){
            int t=ed[i].to,w=ed[i].w;
            if(dis[t]>dis[u]+w){
                dis[t]=dis[u]+w;
                q.push(make_pair(dis[t],t));
            }
        }
    }
}
int main()
{
    while(scanf("%d %d",&m,&n)!=EOF){
        cnt=0;
        init();
        while(m--){
            int u,v,w;
            scanf("%d %d %d",&u,&v,&w);
            add(u,v,w);
            add(v,u,w);
        }
        S=1,E=n;
        dijkstra();
        printf("%d\n",dis[E]);
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值