dijkstra的单源最短路径。如题,
dijkstra就是蓝白点思想(我自己还没有完全搞懂不会写讲解的,等我会讲解了再重编辑这篇博客。)
代码如下
单源最短路径
dijkstra其实就是选一个起始点,从起始点开始遍历剩余的点,求出所有的点到起始点的距离,其中最短的就是最短路径。
//Writer:jr HSZ;%%%WJMZBMR
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#define f(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;
struct Edge {
int next,to,val;
} edge[500005];
int cnt;
int head[500005];
void add(int bg,int ed,int v) {
edge[++cnt].to=ed;
edge[cnt].next=head[bg];
edge[cnt].val=v;
head[bg]=cnt;
}
int n,m,a,s,b,c;
int dis[10005];
bool vis[10005];
int main() {
memset(dis,0x3f,sizeof dis);
memset(head,-1,sizeof head);
scanf("%d%d%d",&n,&m,&s);
f(i,1,m) {
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);//有向图&邻接表存图
}
dis[s]=0;//dijkstra的日常预备
f(i,1,n) {
int minn=0x3f3f3f;
int k=0;
f(j,1,n) {
if(!vis[j]&&dis[j]<minn) {
minn=dis[j];
k=j;
}
}
if(k==0) {
break;
}
vis[k]=1;
for(register int j=head[k]; j!=-1; j=edge[j].next) {//遍历邻接表
if(!vis[edge[j].to]&&dis[edge[j].to]>
(edge[j].val+dis[k])) {/*如果这个点没有被更新过且这个点到
起始点的现距离大于刚更新的那个点到起始点的距离加这个点和前一个
点连接的边的权值则更新这个点。*/
dis[edge[j].to]=edge[j].val+dis[k];
}
}
}
f(i,1,n) {
if(dis[i]==0x3f3f3f3f) {
printf("2147483647 ");
} else printf("%d ",dis[i]);//输出
}
return 0;
}