迪傑斯克拉算法 各種寫法 供參考

 第一種:

#include<iostream>
#include<cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 505;
struct E
{
    int next;
    int val;
};
vector<E> edge[N];
int dis[N];
bool st[N];
int n,m;
int main()
{
   cin>>n>>m;
   memset(dis ,-1 ,sizeof dis);
   memset(st,false,sizeof st);
   
   while(m--)
   {
       int a,b,c;
       cin>>a>>b>>c;
       E tmp;
       tmp.val=c;
       tmp.next=b;
       edge[a].push_back(tmp);
   }
   int newp = 1;
   st[1]=true;
   dis[1]=0;
   for(int i = 1;i < n; i++)
   {
      // cout<<"  "<<newp<<"  ";
       for(int  j=0; j<edge[newp].size(); j++)
       {
           int t = edge[newp][j].next;
           int cost=edge[newp][j].val;
           if(st[t]) continue;
           if(dis[t]==-1||dis[t]>dis[newp]+cost) dis[t] = dis[newp] + cost;
       }
       
       int min=1000000000;
       for(int i=1;i<=n; i++)
       {
           if(st[i]) continue;
           if(dis[i]<min)
           {
               min = dis[i];
               newp = i;
           }
       }
       st[newp] = true;
   }
    for(int i = 1;i<=n;i++)  cout<<dis[i]<<" ";
    cout<<dis[n];
}

第二種:

#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 510;

int n, m;
int g[N][N];
int dist[N];
bool st[N];

int dijkstra()
{
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;

    for (int i = 0; i < n - 1; i ++ )
    {
        int t = -1;
        for (int j = 1; j <= n; j ++ )
            if (!st[j] && (t == -1 || dist[t] > dist[j]))
                t = j;

        for (int j = 1; j <= n; j ++ )
            dist[j] = min(dist[j], dist[t] + g[t][j]);

        st[t] = true;
    }

    if (dist[n] == 0x3f3f3f3f) return -1;
    return dist[n];
}

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

    memset(g, 0x3f, sizeof g);
    while (m -- )
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);

        g[a][b] = min(g[a][b], c);
    }

    printf("%d\n", dijkstra());

    return 0;
}

第三種:

#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>

using namespace std;

typedef pair<int, int> PII;

const int N = 1e5 + 10;

int n, m;
int h[N], w[N], e[N], ne[N], idx;
int dist[N];
bool st[N];

void add(int a, int b, int c)
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}

int dijkstra()
{
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;
    priority_queue<PII, vector<PII>, greater<PII>> heap;
    heap.push({0, 1});

    while (heap.size())
    {
        auto t = heap.top();
        heap.pop();

        int ver = t.second, distance = t.first;

        if (st[ver]) continue;
        st[ver] = true;

        for (int i = h[ver]; i != -1; i = ne[i])
        {
            int j = e[i];
            if (dist[j] > distance + w[i])
            {
                dist[j] = distance + w[i];
                heap.push({dist[j], j});
            }
        }
    }

    if (dist[n] == 0x3f3f3f3f) return -1;
    return dist[n];
}

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

    memset(h, -1, sizeof h);
    while (m -- )
    {
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        add(a, b, c);
    }

    cout << dijkstra() << endl;

    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章