最短路模板
思路:开一个数组dis[i](一开始把数组全初始化为极大值,表示离源点的距离为无穷大),表示 i 点到源点的最短距离。一开始把与源点直接相邻的点和源点的距离存入dis[i]数组,再在dis[]数组中找到一个最小值,并标记。显然该标记点离源点是最近的。而其他点经过该标记点到源点的距离可能比直接原点的距离或经其他路线到源点的距离更短。那么就进行下一步操作,在dis[]数组上把该标记周围的点到源点的距离更新一下。之后又遍历一下dis[],在没有被标记的点中找到离源点最近的点并标记。然后就重复进行遍历、标记、更新操作。
#include<cstdio>
#include<cstring>
const int N=105, INF=9999999;
int dis[N], w[N][N],vis[N];
//w为地图面积
//vis数组用来放置已经是最小路径的点
int n,m;//n为路口数和赛场所在地,m为有多少条路
void Dijkstra(int src){
for(int i=1; i<=n; ++i)
dis[i] = INF;
dis[src] = 0; //将源点距离标记为0
memset(vis, 0, sizeof(vis));//初始化
for(int i=1; i<=n; ++i){
int u=-1;
for(int j=1; j<=n; ++j)
if(!vis[j]){//找出最小的dis,将其记录
if(u==-1 || dis[j]<dis[u])
u=j;
}
vis[u] = 1; //将该点放入确定是最小路径的数组
for(int j=1; j<=n; ++j)
if(!vis[j]){ //看看是否已经确定是最小路径
int tmp = dis[u] + w[u][j]; //如果从源点经u点到j点的距离
if(tmp <dis[j]) //更近,则更新从源点到j点的距离
dis[j] = tmp;
}
}
}
int main(){
int a,b,c;
while(scanf("%d%d",&n,&m)!=EOF&&n+m!=0){
//初始化
for(int i = 1;i<=n;++i){
w[i][i] = INF;
for(int j=i+1; j<=n; ++j)
w[i][j] = w[j][i] = INF;
}
for(int i = 0;i<m;++i){
scanf("%d%d%d",&a,&b,&c);
//无向图,两个点来回花费一样的时间
//a与b表示两点,c表示花费
w[a][b] = w[b][a] = c;
}
Dijkstra(1);
printf("%d\n", dis[n]);
//输出从1到n的最短花费
}
return 0;
}
593

被折叠的 条评论
为什么被折叠?



