最短路 模板总结

前向星 + Dijkstra

#include <cstdio>
#include <queue>
#include <iostream>
#include <cstring>

using namespace std;

const int maxn = 1e5 + 10;
const int inf = 0x3f3f3f3f;

struct node
{
    int to, w;
    int next;
} data[maxn];

int cnt;
int head[maxn], dist[maxn];

void add(int u, int v, int w) {
    data[cnt].to = v;
    data[cnt].w = w;
    data[cnt].next = head[u];
    head[u] = cnt++;
}

void dijkstra(int s) {
    memset(dist, inf, sizeof(dist));
    priority_queue<pair<int, int> > q;
    q.push(make_pair(0, s));
    dist[s] = 0;

    while(!q.empty())
    {
        int now = q.top().second;
        q.pop();

        for(int i = head[now]; ~i; i = data[i].next)
        {
            int u = data[i].to;
            if(dist[u] > dist[now] + data[i].w)
            {
                dist[u] = dist[now] + data[i].w;
                q.push(make_pair(-dist[u], u));
            }

        }
    }
}

int main()
{
    int n, m; //n为点个数 m为边
    cnt = 0;
    scanf("%d %d", &m, &n);
    memset(head, -1, sizeof(head));
    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);
    }

    dijkstra(1);
    printf("%d\n", dist[n]);

}

前向星+spfa

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>

using namespace std;

const int maxn = 1e5 + 100;
const int inf = 0x3f3f3f3f;

struct node {
   int v;
   int w;
   int next;
}e[maxn];

int head[maxn], cnt, dist[maxn];
bool vis[maxn];

void add(int u, int v, int w)
{
    e[cnt].v = v;
    e[cnt].w = w;
    e[cnt].next = head[u];
    head[u] = cnt++;
}

void spfa(int s, int t)
{
    memset(vis, false, sizeof(vis));
    memset(dist, inf, sizeof(dist));
    queue<int> q;
    q.push(s);
    vis[s] = true;
    dist[s] = 0;

    while(!q.empty())
    {
        int now = q.front();
        q.pop();
        vis[now] = false;

        for(int i = head[now]; ~i; i = e[i].next)
        {
            int v = e[i].v;
            int w = e[i].w;
            if(dist[v] > dist[now] + w)
            {
                dist[v] = dist[now] + w;
                if(!vis[v])
                {
                    q.push(v);
                    vis[v] = true;
                }
            }
        }
    }

    printf("%d\n", dist[t]);
}

int main()
{
    int m, n;
    scanf("%d %d", &m, &n);

    memset(head, -1, sizeof(head));

    cnt = 0;
    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);
    }

    spfa(1, n);

}

vector + dijkstra

#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
#include <vector>

using namespace std;
const int maxn = 1e7;
int n, m, dist[1123];

vector<pair<int, int> >e[1123];

void init()
{
    for(int i = 0; i <= n; i++)
    {
        e[i].clear();
        dist[i] = maxn;
    }
}

void dijkstra()
{
   priority_queue<pair<int, int> > q;
   q.push(make_pair(0, 1));
   while(!q.empty())
   {
       int now = q.top().second;
       q.pop();
       for(int i = 0; i < e[now].size(); i++)
       {
           int v = e[now][i].first;
           if(dist[v] > dist[now] + e[now][i].second)
           {
              dist[v] = dist[now] + e[now][i].second;
              q.push(make_pair(-dist[v], v));
           }
       }
   }
}

int main()
{
    int i, u, v, w;
    scanf("%d %d", &m, &n);
    init();
    for(i = 0; i < m; i++)
    {
        scanf("%d %d %d", &v, &u, &w);
        e[v].push_back(make_pair(u, w));
        e[u].push_back(make_pair(v, w));
    }

    dist[1] = 0;
    dijkstra();

    printf("%d\n", dist[n]);
}

vector+spfa

#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
#include <vector>

using namespace std;
const int maxn = 1e6;

int inq[1123], dist[1123], n, m;
vector<pair<int, int> > e[1123];

void init()
{
    for(int i = 0; i <= n; i++)
    {
        e[i].clear();
        inq[i] = 0;
        dist[i] = maxn;
    }
}

void spfa()
{
    queue<int> q;
    q.push(1);
    dist[1] = 0;
    inq[1] = 1;
    while(!q.empty())
    {
        int now = q.front();
        q.pop();
        inq[now] = 0;
        for(int i = 0; i < e[now].size(); i++)
        {
            int v = e[now][i].first;
            if(dist[v] > dist[now] + e[now][i].second)
            {
                dist[v] = dist[now] + e[now][i].second;
                if(!inq[v])
                {
                    q.push(v);
                    inq[v] = 1;
                }

            }
        }
    }
}

int main()
{
    int i, u, v, w;
    scanf("%d %d", &m, &n);
    init();
    for(i = 0; i < m; i++)
    {
        scanf("%d %d %d", &u, &v, &w);
        e[u].push_back(make_pair(v, w));
        e[v].push_back(make_pair(u, w));
    }

    spfa();
    printf("%d\n", dist[n]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/deerly_/article/details/80442228
今日推荐