Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
struct_cym
游戏编写
提交
f1543369
游
游戏编写
项目概览
struct_cym
/
游戏编写
通知
5
Star
2
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
游
游戏编写
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
f1543369
编写于
10月 02, 2021
作者:
struct_cym
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
删除 迪杰斯特拉
上级
edc04930
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
0 addition
and
61 deletion
+0
-61
迪杰斯特拉
迪杰斯特拉
+0
-61
未找到文件。
迪杰斯特拉
已删除
100644 → 0
浏览文件 @
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录