Dijkstra的实现(用vector模拟邻接链表)

来源:互联网 发布:路由器数据监控软件 编辑:程序博客网 时间:2024/06/06 05:53
#include <stdio.h>#include <vector>using namespace std;struct E{    int next; //代表直接相邻的结点    int c;};vector<E> edge[101]; //邻接链表bool mark[101];int Dis[101];int main() {    int n, m;    while(scanf("%d %d", &n, &m) != EOF) {        if(m == 0 && n == 0) break;        for(int i = 1; i <= n; i ++) edge[i].clear();        int a, b, c;        while(m --) {            scanf("%d%d%d", &a, &b, &c);            E tmp;            tmp.c = c;            tmp.next = b;            edge[a].push_back(tmp);            tmp.next = a;            edge[b].push_back(tmp);        }        for(int i = 1; i <= n; i ++) {            Dis[i] = -1;            mark[i] = false;        }        Dis[1] = 0; mark[1] = true;        int newP = 1;        for(int i = 1; i < n; i ++) {            for(int j = 0; j < edge[newP].size(); j ++) {                int t = edge[newP][j].next;                int c = edge[newP][j].c;                if(mark[t] == true) continue;                if(Dis[t] == -1 || Dis[t] > Dis[newP] + c)//若该结点尚不可达,或者从新加入的结点经过一条边到达时比以往更近                        Dis[t] = Dis[newP] + c;            }            int min = 123123123;            for(int j = 1; j <= n; j++) {                if(mark[j] == true) continue;                if(Dis[j] == -1) continue;                if(Dis[j] < min) {                    min = Dis[j];                    newP = j;                }            }            mark[newP] = true;        }        printf("%d\n", Dis[n]);    }    return 0;}
 
以前只是用邻接矩阵实现过。。学习了。。。

原创粉丝点击