未优化的dijsktra(参考YSQ)
2016-03-08 19:20
435 查看
#include<iostream>//要求边不存在负权,求单源最短路,即从一个顶点出发,到其余每个点的最短路 #include<cstring> #include<cmath> const int mn=1000+10,me=2*mn+10; int arcs[mn][mn];//邻接矩阵 int dis[mn];//dis[]代表从顶点1到点i的最短路 bool vis[mn];//代表这个点的最短路是否被求出 int m,n;//n代表点数,m代表边数 int cnt=1;//cnt代表s集合中点的个数 using namespace std; void dijsktra(){ for(int i=1;i<=n;i++)//初始化,将arcs[1][i](也就是与远点直接相连的点更新,其他点为0x3f) dis[i]=arcs[1][i]; vis[1]=true;//1-1已确定 dis[1]=0; while(cnt<n){ int minn=1;//dis[i]不一定属于v集合***v集合代表未被确定的点 for(int i=1;i<=n;i++){//dis[]最大的点一定属于v集合**because dis[]最小的点已经被确定,已属于s集合 if(dis[i]>dis[minn]) minn=i; } for(int i=1;i<=n;i++){//寻找v集合中dis最小的点,放入s集合 if(dis[i]<dis[minn]&&vis[i]==false) minn=i; } vis[minn]=true; for(int i=1;i<=n;i++) dis[i]=min(dis[i],dis[minn]+arcs[i][minn]); cnt++; } } int main(){ cin>>m>>n; memset(arcs,0x3f,sizeof(arcs)); memset(dis,0x3f,sizeof(dis)); memset(vis,false,sizeof(vis)); for(int i=1,x,y,z;i<=m;i++){ cin>>x>>y>>z; arcs[x][y]=min(z,arcs[x][y]); arcs[y][x]=arcs[x][y]; } dijsktra(); cout<<dis <<endl; return 0; }
相关文章推荐
- 初学图论-Kahn拓扑排序算法(Kahn's Topological Sort Algorithm)
- 初学图论-Bellman-Ford单源最短路径算法
- 初学图论-DAG单源最短路径算法
- 初学图论-Dijkstra单源最短路径算法
- 初学图论-Dijkstra单源最短路径算法基于优先级队列(Priority Queue)的实现
- 封装好的Folyd建图,C++源码
- LCA模板
- 图论学习笔记之一——Floyd算法
- 【LCA】SPOJ QTREE2
- poj 3249 Test for Job 最长路
- HDU 2544
- Timus 1557 Network Attack DFS+各种各种...
- HDU1289 Tarjan-模板题
- Poj2638 网络流+最短路+二分答案
- Aizu1311 分层图最短路 (...大概)
- HDU 3631 Shortest Path
- 二分图匹配模板
- 最短路径 -- spfa
- POJ2377 Bad Cowtractors
- Six Degrees of Cowvin Bacon(最短路径floyd算法)