☆1003 Dijstra

循环N次

算法分为两部分:

1)找到距离最小的城市,找不到距离更小的城市时退出方法

2)更新距离

实际操作时,先初始化:

更新dis为INF,更新dis[start] = 0;

 

变种:

  • 找最短路径的条数:建立 int num[n] 数组,更新时覆盖num, 如果距离相同 num[v]=num[u]+num[v] 
  • 存在第二约束条件:更新时,同上
  • 记录path: int pre[N] , 更新时 pre[v]=u , 打印路径
    void print_path(int start){
        if(path[start]==start)printf("%d ",start);
        else{
            print_path(path[start]);
            printf("%d ",start);
        }
    }

     

普通版本代码:

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

const int MAXV=1000;
const int INF=0x3FFFFFFF;



struct Node{
    int v, dis;
};

vector<Node> Adj[MAXV];
int n;
int d[MAXV];
bool vis[MAXV]={false};


void Dijkstra(int s){
    fill(d, d+MAXV,INF);
    d[s]=0;
    for(int i=0;i<n;i++){
        int u=-1, MIN=INF;
        for(int j=0;j<n;j++){
            if(vis[j]==false&&d[j]<MIN){
                u=j;
                MIN = d[j];
            }
        }
        if(u==-1)return;//说明不连通


        vis[u]=true;
        for(int j=0;j<Adj[u].size();j++){
            if(vis[v]==false&&(MIN+Adj[u][j].dis)<d[v]){
                d[v]=d[u]+Adj[u][j].dis;
            }
        }
    }


}

 

posted on 2019-02-20 11:21  Vitavi  阅读(121)  评论(0编辑  收藏  举报

导航