思路:先找出最短的一个点,也就是起点,从起点出发,找最短的边,同时标记起点为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 ;
}

最新文章

  1. JavaScript 学习笔记——cssText
  2. 输出日志实例改成用Spring的AOP来实现
  3. Linux grep命令和正则表达式
  4. Android开发自学笔记(Android Studio1.3.1)&mdash;1.环境搭建
  5. 对蓝牙profile的理解
  6. JPA学习(3)JPA API
  7. SqlServer StringToTable性能测试
  8. Struts2配置详解_配置Action
  9. Silverlight中弹出网页
  10. [uiview animation ...] 这个函数有多少没有认识的可能!翻盘效果 上下左右怎么翻都不怕
  11. 【HDOJ】1811 Rank of Tetris
  12. SVN版本日志对话框命令使用指南
  13. pycares cffi
  14. SQLServer 扫盲
  15. linux ll命令参数的详解
  16. ucos任务控制块详解
  17. NIOS II 之串口学习
  18. Axure RP Pro 7.0苏宁易购式标签切换效果教程
  19. RabbitMQ进阶使用-延时队列的配置(Spring Boot)
  20. win8+iis8+PHP5安装配置和Zend Optimizer安装教程

热门文章

  1. BZOJ1150:[CTSC2007]数据备份
  2. bzoj 2648 SJY摆棋子——KDtree
  3. zabbix发送邮件
  4. Erlang generic standard behaviours -- gen_server system msg
  5. HDU1257(简单DP)
  6. cisco 2901 配置拨号上网
  7. [matlab]bp神经网络工具箱学习笔记
  8. 在重命名SqlServer数据库时,报5030错误的解决办法
  9. windows、Linux 测试服务器、电脑的某些个端口是否打开
  10. 点云视窗类CloudViewer