Dijkstra算法,单源最短路径(一个起点到各个点的最短距离)

来源:互联网 发布:surge mac 下载 编辑:程序博客网 时间:2024/04/30 22:08
#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>#include <string.h> //hdu2544#include <queue>  //Dijkstra算法,单源最短路径(一个起点到各个点的最短距离)       #define inf 9999999using namespace std;int n, map[110][110], dis[110], vis[110];void Dijkstra(int x){int t, j, min, k;memset(vis, 0 ,sizeof(vis));  //vis[t]=0表示还没有求出最短距离 for(t=1; t<=n; ++t) { dis[t]=map[x][t]; //dis[t]指的是从原点到t所要的距离 } vis[x]=1;  //原点先标记已求出 for(j=1; j<=n; ++j)  //求n个点距离x的最短距离的循环次数(因为有n个点) { min=inf;   //注意每次都要重新赋值 for(t=1; t<=n; ++t) { if(!vis[t]&&dis[t]<min) { k=t;   //k记录(未求出的)最小距离的节点 min=dis[t]; } } vis[k]=1; for(t=1; t<=n; ++t)   //更新剩余的节点 { if(!vis[t]&&dis[k]+map[k][t]<dis[t])   //dis[k](k这个节点已经求出)已是最小 dis[t]=dis[k]+map[k][t]; } } return ;}int main(){int t, m, j, a, b, c;while(scanf("%d%d", &n, &m)!=EOF){if(n==0&&m==0)break;for(j=1; j<=n; ++j){for(t=1; t<=n; ++t)map[j][t]=inf;   //初始化,j到t的距离}while(m--){scanf("%d%d%d", &a, &b, &c);map[a][b]=map[b][a]=c;  //无向图}Dijkstra(1);  //起始点printf("%d\n", dis[n]);}return 0;}




另一道类似hdu1874

#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include <cstring>#include <string.h>#include <queue>  //Dijkstra算法,单源最短路径(一个起点到各个点的最短距离)       #define inf 1000000000using namespace std;int n, map[210][210], dis[210], vis[210];void Dijkstra(int x, int g){int t, j, min, k;memset(vis, 0 ,sizeof(vis));  //vis[t]=0表示还没有求出最短距离 for(t=0; t<n; ++t) { dis[t]=map[x][t]; //dis[t]指的是从原点到t所要的距离 } vis[x]=1;  //原点先标记已求出 for(j=0; j<n; ++j)  //求n个点距离x的最短距离的循环次数(因为有n个点) { min=inf;   //注意每次都要重新赋值 for(t=0; t<n; ++t) { if(!vis[t]&&dis[t]<min) { k=t;   //k记录(未求出的)最小距离的节点 min=dis[t]; } } vis[k]=1; if(k==g)return ; for(t=0; t<n; ++t)   //更新剩余的节点 { if(!vis[t]&&dis[k]+map[k][t]<dis[t])   //dis[k](k这个节点已经求出)已是最小 dis[t]=dis[k]+map[k][t]; } } return ;}int main(){int t, m, j, a, b, c, start, end;while(scanf("%d%d", &n, &m)!=EOF){for(j=0; j<n; ++j){for(t=0; t<n; ++t)map[j][t]=inf;   //初始化,j到t的距离}while(m--){scanf("%d%d%d", &a, &b, &c);if(a<b)    //处理重边的情况{map[a][b]=min(map[a][b], c);map[b][a]=map[a][b];}else {map[b][a]=min(map[b][a], c);map[a][b]=map[b][a];}}scanf("%d%d", &start, &end);if(start==end){printf("0\n");continue;}Dijkstra(start, end);  //起始点if(dis[end]!=inf)printf("%d\n", dis[end]);else printf("-1\n");}return 0;}




原创粉丝点击