Dijkstra模板
来源:互联网 发布:知乎电脑客户端 编辑:程序博客网 时间:2024/06/10 01:25
Dijkstra算法是一个计算单源最短路径的算法,但是注意图中不能出现负权,这是一个函数不含参的模板
#define INF 100000000#define n 1000int map[1100][1100],dis[1100],flag[1100];void dijkstra(){ int i,j,k,min; memset(flag,0,sizeof(flag)); flag[0]=1; for(i=0;i<=n;i++) { dis[i]=map[0][i]; } for(i=1;i<n;i++) { min=INF; for(j=1;j<=n;j++) { if(!flag[j]&&dis[j]<min) { min=dis[j]; k=j; } } flag[k]=1; for(j=1;j<=n;j++) { if(!flag[j]&&dis[j]>dis[k]+map[k][j]) dis[j]=dis[k]+map[k][j]; } }}
这是一个含参,参数为源点的模板:
#define inf 0x3f3f3f3f const int N = 505; int map[N][N]; //利用邻接矩阵保存图 int dis[N]; //最短路值 int vis[N]; //标记数组 int num[N]; //路径个数 int maxx[N]; //最短路径最大的权值和 int a[N]; //每个点的权值 int pre[N]; //保存路径,记录前驱 void dij(int start){ int i; memset(vis,0,sizeof(vis)); for(i=0;i<n;i++){ if(i==start) { dis[i]=0; maxx[i]=a[i]; } else { dis[i]=map[start][i]; maxx[i]=a[start]+a[i]; //重要 maxx初始化 } if(i!=start&&map[start][i]!=inf) pre[i]=start; else pre[i]=-1; } vis[start]=1; for(i=0;i<n;i++){ int t=inf,j,k; for(j=0;j<n;j++){ if(!vis[j]&&t>dis[j]){ t=dis[j]; k=j; } } if(t==inf){ break; //不连通 } vis[k]=1; for(j=0;j<n;j++){ if(!vis[j]){ if(dis[j]>dis[k]+map[k][j]){ dis[j]=dis[k]+map[k][j]; maxx[j]=maxx[k]+a[j]; num[j]=num[k]; pre[j]=k; } else if(dis[j]==dis[k]+map[k][j]){ num[j]=num[j]+num[k]; if(maxx[j]<maxx[k]+a[j]){ maxx[j]=maxx[k]+a[j]; pre[j]=k; } //maxx[j]=max(maxx[j],maxx[k]+a[j]); } } } } }
0 0
- dijkstra 模板
- dijkstra 模板
- Dijkstra模板
- dijkstra模板
- dijkstra模板
- Dijkstra模板
- (Dijkstra模板)
- Dijkstra模板
- Dijkstra模板
- Dijkstra 模板
- Dijkstra模板
- dijkstra 模板
- dijkstra模板
- dijkstra模板
- dijkstra模板
- [模板]Dijkstra
- dijkstra 模板
- 模板 Dijkstra
- Windows 下Redis安装以及PHP的扩展DLL下载
- 基于jQuery的AJAX和JSON实现纯
- [网络流]poj2391 Ombrophobic Bovines
- 从1.0到2.0,我们还要走多久?
- c++之STL(13) STL 算法 - 查找算法(5)adjacent_find(b,e) adjacent_find(b,e,p)
- Dijkstra模板
- 夏令营day5总结
- floyd算法模板
- C++ lambda
- Ubuntu系统播放*.avi格式出错
- sqlmap工具使用小结
- 设计模式GOF23——迭代器模式
- Java基础学习——注解(Annotations)学习
- 洛谷P1631 序列合并