Dijkstra算法(求一点到任意一点的最短距离)
2024-09-03 03:33:35
思路:先找出最短的一个点,也就是起点,从起点出发,找最短的边,同时标记起点为true(代表已经访问过),访问过的点就不用再访问了,依次下去,保证每一次找到的边都是最短的边
到最后没有边可以更新了就代表结束
看代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<math.h>
#include<algorithm>
#include<set>
#include<queue>
#include<map>
typedef long long ll;
using namespace std;
const ll mod=1e9+;
const int maxn=1e3+;
const int maxk=+;
const int maxx=1e4+;
const ll maxe=+;
#define INF 0x3f3f3f3f3f3f
int v,e;
ll cost[maxn][maxn];//cost[u][v]代表边(u,v)的权值
ll d[maxn];//从起点出发到该点的最小距离
bool vis[maxn];
void solve(int s)
{
for(int i=;i<v;i++)
{
d[i]=INF;
}
memset(vis,false,sizeof(vis));
d[s]=;
while(true)
{
int flag=-;
for(int i=;i<v;i++)
{
//在所有点中找尚未使用的最小距离的点
if(!vis[i]&&(flag==-||d[i]<d[flag]))
flag=i;
}
if(flag==-)
break;
vis[flag]=true;
for(int i=;i<v;i++)
{
d[i]=min(d[i],d[flag]+cost[flag][i]);
}
}
for(int i=;i<v;i++)
cout<<d[i]<<" ";
cout<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin>>v>>e;
for(int i=;i<v;i++)
{
for(int j=;j<v;j++)
cost[i][j]=INF;
}
int a,b,va;
for(int i=;i<e;i++)
{
cin>>a>>b>>va;
cost[a][b]=va;
}
solve();
return ;
}
最新文章
- JavaScript 学习笔记——cssText
- 输出日志实例改成用Spring的AOP来实现
- Linux grep命令和正则表达式
- Android开发自学笔记(Android Studio1.3.1)&mdash;1.环境搭建
- 对蓝牙profile的理解
- JPA学习(3)JPA API
- SqlServer StringToTable性能测试
- Struts2配置详解_配置Action
- Silverlight中弹出网页
- [uiview animation ...] 这个函数有多少没有认识的可能!翻盘效果 上下左右怎么翻都不怕
- 【HDOJ】1811 Rank of Tetris
- SVN版本日志对话框命令使用指南
- pycares cffi
- SQLServer 扫盲
- linux ll命令参数的详解
- ucos任务控制块详解
- NIOS II 之串口学习
- Axure RP Pro 7.0苏宁易购式标签切换效果教程
- RabbitMQ进阶使用-延时队列的配置(Spring Boot)
- win8+iis8+PHP5安装配置和Zend Optimizer安装教程
热门文章
- BZOJ1150:[CTSC2007]数据备份
- bzoj 2648 SJY摆棋子——KDtree
- zabbix发送邮件
- Erlang generic standard behaviours -- gen_server system msg
- HDU1257(简单DP)
- cisco 2901 配置拨号上网
- [matlab]bp神经网络工具箱学习笔记
- 在重命名SqlServer数据库时,报5030错误的解决办法
- windows、Linux 测试服务器、电脑的某些个端口是否打开
- 点云视窗类CloudViewer