首页 > 代码库 > 做了一道跑大数据的最短路挂了,基于vector的二维模拟邻接表实现Dijkstra算法(*【模板】)

做了一道跑大数据的最短路挂了,基于vector的二维模拟邻接表实现Dijkstra算法(*【模板】)

代码:

     

#include <stdio.h>#include <string.h>#include <string>#include <vector>#include <algorithm>#define INF 2100000000using namespace std;int n;struct node{    int dd;    int w;}t;vector<node>q[500001];unsigned int dis[500001];bool vis[500001];void Dijkstra(int s, int e){    int i, j;    memset(vis, false, sizeof(vis));    for(i=0; i<=n; i++)    {        dis[i] = INF;    }    int len=q[s].size();    for(i=0; i<len; i++)    {        if(q[s][i].w < dis[q[s][i].dd] )            dis[q[s][i].dd]=q[s][i].w; //从起点开始的dis数组更新    }    vis[s]=true;    for(int k=0; k<n-1; k++)    {        int pos, mm=INF;        for(i=1; i<=n; i++)        {            if( !vis[i] && dis[i]<mm )            {//当前节点未被访问过且权值较小                mm=dis[i]; pos=i;            }        }        vis[pos]=true;        //再次更新dis数组        len=q[pos].size();        for(j=0; j<len; j++)        {            if( !vis[q[pos][j].dd] && dis[ q[pos][j].dd ]>q[pos][j].w+dis[pos] )                dis[q[pos][j].dd ] = q[pos][j].w + dis[pos];        }    }    printf("%d\n", dis[e] );}int main(){    int m;    int i;    int u,v, w;    int s, e;    while(scanf("%d %d", &n, &m)!=EOF)    {        for(i=0; i<=n; i++)            q[i].clear();        for(i=0; i<m; i++)        {            scanf("%d %d %d", &u, &v, &w);            t.dd=v; t.w=w;            q[u].push_back(t);            t.dd=u; t.w=w;            q[v].push_back(t);        }        scanf("%d %d", &s, &e);        Dijkstra(s, e);    }    return 0;}

 

做了一道跑大数据的最短路挂了,基于vector的二维模拟邻接表实现Dijkstra算法(*【模板】)