单源最短路(Dijkstra)邻接表实现

来源:互联网 发布:abb机器人编程培训 编辑:程序博客网 时间:2024/05/22 12:08
#include<iostream>#include<cstdio>#define dif 999999999using namespace std;struct haha{    int u;    int v;    int w;}e[1001];int dis[100];int book[100];int next[1001],first[100];int main(){    int n,m;    int cnt=0;    cin >> n >> m;    int i,j,k,w;    for(i=1;i<=n;i++)        dis[i]=dif;    for(i=1;i<=m;i++)        first[i]=-1;    for(i=1;i<=m;i++){        cin >> e[i].u >> e[i].v >> e[i].w;//有重边的情况在后面会处理        next[i]=first[e[i].u];        first[e[i].u]=i;    }    book[1]=0;dis[1]=0;cnt++;    int index=first[1];//邻接表的方便之处就在于,不必每次都遍历每一个点去看有没有边,可以直接操作有边的点。    while(index!=-1){        if(dis[e[index].v]>e[index].w)//只需要在这里处理源点有重边的情况,后面的就算有重边也会自动采用最小那个。            dis[e[index].v]=e[index].w;        index=next[index];    }    int mins,u=1;    while(cnt<n-1){        mins=dif;        index=first[u];        while(index!=-1){            if(book[e[index].v]==0 && mins>e[index].w){                mins=e[index].w;                u=e[index].v;            }            index=next[index];        }        book[u]=1;cnt++;        //松弛(注意下面可以用到u,但不可改变u的值)        index=first[u];        while(index!=-1){            if(dis[e[index].v]>e[index].w+dis[e[index].u])                dis[e[index].v]=e[index].w+dis[e[index].u];            index=next[index];        }    }    for(i=1;i<=n;i++)        printf("%6d",dis[i]);    return 0;}
阅读全文
0 0
原创粉丝点击