1. 程式人生 > >圖論-最短路-迪傑斯特拉演算法

圖論-最短路-迪傑斯特拉演算法

圖論–最短路–Dijkstra(迪傑斯特拉)演算法 及 堆優化

1.陣列:

#include<cstdio>
#include<cstring>
const int maxn=100;
int map[maxn][maxn];
int dis[maxn];
int path[maxn];
bool vis[maxn];
int n;
void dijk(int s)  ///  s 起點
{
    memset(path,-1,sizeof(path));
    memset(dis,0x3f,sizeof(dis));      ///快速初始化為無窮大
    memset(vis,
0,sizeof(vis)); dis[s]=0; while(1) { int k=0; for(int j=1;j<=n;j++) { if(!vis[j]&&dis[j]<dis[k]) ///這一步找未收錄頂點中dis值最小的 k=j; } if(k==0) return; vis[k]=1; ///收錄頂點k for(int j=1;j<=
n;j++) { if(dis[j]>dis[k]+map[k][j]) { dis[j]=dis[k]+map[k][j]; path[j]=k; } } } } void print(int x) { if(x==-1) return ; print(path[x]); printf("%d->",x); } int main() { int m,x,y,z,order; scanf
("%d%d",&n,&m); memset(map,0x3f,sizeof(map)); for(int i=0;i<m;i++) { scanf("%d%d%d",&x,&y,&z); map[x][y]=map[y][x]=z; } dijk(1); scanf("%d",&order); printf("%d\n",dis[order]); print(path[order]); printf("%d",order); return 0; }

2.堆優化

#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
const int Ni = 10000;
const int INF = 1<<27;
struct node{
    int to,w;
    node(){}
    node(int a,int b){to=a;w=b;}
    bool operator < (const node & a) const
    {
        if(w==a.w) return to<a.to;
        else return w > a.w;
    }
};
vector<node> eg[Ni];
int dis[Ni],n;
void Dijkstra(int s)
{
    int i;
    for(i=0;i<=n;i++) dis[i]=INF;
    dis[s]=0;
    priority_queue<node> q; ///  用優先佇列優化  優先佇列 預設升序
    q.push(node(s,dis[s]));  /// 起點
    while(!q.empty())
    {
        node x=q.top();q.pop();
        for(i=0;i<eg[x.to].size();i++)
        {
            node y=eg[x.to][i];
            if(dis[y.to]>x.w+y.w)
            {
                dis[y.to]=x.w+y.w;
                q.push(node(y.to,dis[y.to]));
            }
        }
    }
}
int main()
{
    int a,b,w,m;
    while(scanf("%d%d",&n,&m),n+m)
    {
        for(int i=0;i<=n;i++) eg[i].clear();
        while(m--)
        {
            scanf("%d%d%d",&a,&b,&w);
            eg[a].push_back(node(b,w));
            eg[b].push_back(node(a,w));
        }
        Dijkstra(1);
        printf("%d\n",dis[n]);
    }
    return 0;
}