首页 > 代码库 > 做了一道跑大数据的最短路挂了,基于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算法(*【模板】)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。