提交 f1543369 编写于 作者: struct_cym's avatar struct_cym

删除 迪杰斯特拉

上级 edc04930
/*我写过一个关于最短路的博客,很全
https://blog.csdn.net/struct_cym/article/details/120106356?spm=1001.2014.3001.5501
别忘了顺便给我三连一下
*/
#include <iostream>
#include <vector>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
const int N=1e3+10;
int d[N],vs[N]; //d是该点距起点的距离,vs是这个点的距离是否被确定
struct Edge{ //邻接表
int to;//所连接的点
int w;//与所连接的点的距离
};
vector<Edge>edge[N]; //构造邻接表
int n,m;
void add(int u,int v,int w){//连接点和线
edge[u].push_back({v,w});
edge[v].push_back({u,w}); //如果是单向图就把这段删掉
}
int main(){
while(cin>>n>>m&&n!=0&&m!=0){ //这是多样例输入
int u,v,w; //u点距v点w远
for(int i=1;i<=m;i++){ //连接
cin>>u>>v>>w;
add(u,v,w);
}
for(int i=1;i<=n;i++){ //初始化 一开始所有点离起点都是无限远
d[i]=INF;
vs[i]=0;
}
d[1]=0; //起点距起点一定是0
for(int i=1;i<=n;i++){
int x=0,m=INF; //找目前距起点最近的点
for(int j=1;j<=n;j++){
if(!vs[j]&&d[j]<=m){ //没有被找过且距离最小
x=j; //标记
m=d[j];
}
}
vs[x]=1; //把目前离起点最近的点确定
for(int j=0;j<edge[x].size();j++){ //松弛边
d[edge[x][j].to]=min(d[edge[x][j].to],d[x]+edge[x][j].w);
/*
起点直接到x第j个连接的点的距离=min(起点直接到j的距离,起点到x的距离+x到j的距离)
*/
//最难理解的就是松弛
}
}
cout<<d[n]<<endl;
memset(edge,0,sizeof(edge));
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册