dijkstra + spfa

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define INF 0x3f3f3f
int cnt=0,head[INF],dis[INF];
int n,m;
struct edge{
    int v;
    int next;
    int w;
}e[INF];
int add(int u,int v,int w){
    e[++cnt].v = v;
    e[cnt].w = w;
    e[cnt].next = head[u];
    head[u] = cnt;
}
struct node{
    int d,u;
    bool operator <(const node &rhs) const
    {
        return d > rhs.d;
    }
};
inline void dij(){
    memset(dis,0x3f3f,sizeof(dis));
    dis[1] = 0;
    priority_queue<node> q;
    q.push((node){1,0});
    while(!q.empty())
    {
        node fr = q.top();
        q.pop();
        int u = fr.u;
        int d = fr.d;
        if(d != dis[u]) continue;
        for(int i = head[u];i; i = e[i].next)
        {
            int v = e[i].v;
            int w = e[i].w;
            if(dis[u] + w < dis[v])
            {
                dis[v] = dis[u] + w;
                q.push((node){v,dis[v]});
            }
        }
    }
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i = 1;i <= m;i++)
    {
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);
        add(y,x,z);
    }
    dij();
    printf("%d\n",dis[n]);
    return 0;
}

spfa

int spfa(){
    int che[INF],dis[INF];
    memset(che,0,sizeof(che));
    memset(dis,0x3f3f,sizeof(dis));
    dis[1] = 0;
    che[1] = 1;
    queue<node> q;
    q.push((node){1,0});
    while(!q.empty())
    {
        node fr = q.front();
        q.pop();
        che[fr.u]  = 0;
        int u = fr.u;
        int d = fr.d;
        for(int i=head[u];i;i=e[i].next)
        {
            int v = e[i].v;
            int w = e[i].w;
            if(dis[v] > dis[u] + w){
                dis[v] = dis[u] + w;
                if(!che[v]){
                    che[v] = 1;
                    q.push(v);
                }
            }
        }
    }
}

 

posted @ 2022-07-13 15:38  leojiang  阅读(20)  评论(0)    收藏  举报