图结构练习——最短路径(dijkstra算法(迪杰斯拉特))
图结构练习——最短路径
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
输入
输出
示例输入
3 2
1 2 1
1 3 1
1 0
示例输出
1
0 代码:
#include <stdio.h>
#include <string.h>
#define p 65535//必须加括号;
int m,n;
int a[][], v[], d[];//v是标记数组,d数组是保存最小权值的数组,相当于lowcost数组
void Dijkstra()//n在这里是节点数
{
//d数组说明:d数组中的每一个元素都保存住源节点到数组元素下标x的最短路的权值累加
int i;
memset(v , , sizeof(v));
for(i = ; i <= n; i++)
d[i] = a[][i];//第一个节点相接的所有边的权值都保存起来;
v[] = ;//标记第一个,已被访问过;
d[] = ;//第一个到自己的距离为0;
for(i = ; i <= n-; i++)
{
int x, y, t = p;//让t为最大值
for(y = ; y <= n; y++)
{
if(!v[y] && d[y] <= t)
{
x=y;
t=d[x];//t保存住最小权值
}
}
v[x] = ;//x已经访问完
for(y = ; y <= n; y++)//更新法则和prim算法不相同,其余均相同
{
if(v[y]==)//这句有没有不影响结果,为什么?
{
if(d[y] > t + a[x][y])
{
d[y] = t + a[x][y];
}
}
}
}
}
int main()
{
int i, j;
int t1, t2, t3;
while(~scanf("%d %d",&n, &m))
{
for(i = ; i <= n; i++)
for(j = ; j <= n; j++)
a[i][j] = p;
for(i = ; i <= m; i++)
{
scanf("%d %d %d",&t1, &t2, &t3);
if(a[t1][t2] > t3)//确保重复出现权值的问题,保证最小权值;
{
a[t1][t2] = t3;
a[t2][t1] = t3;
}
}
Dijkstra();
printf("%d\n",d[n]);
}
return ;
}
以下代码是从用prim算法求最小生成树的代码改写成的代码(sdut 2144 http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2144),修改的地方只有2处,本质上只是更改了更新法则部分:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int map[][];
int m,n;
int prim()
{
int lowcost[];
int f[]={};
int g[];
int i,j,min,k,sum=;
lowcost[]=;
f[]=;
g[]=;
for(i=;i<=m;i++)
{
lowcost[i]=map[][i];
g[i]=;//本语句不可以省略
}
for(i=;i<=m;i++)
{
min=;
for(j=;j<=m;j++)
if(lowcost[j]<=min&&f[j]==)//寻找与已经生成的最小生成树邻接的边的最小权值
{
min=lowcost[j];//min是最小权值
k=j;//k是最小权值边的终端所对应的数组元素的下标
}
//printf("%d->%d:%d\n",g[k],k,min);//本语句只是为表现出最小生成树的结构,g数组也是为此而定义,可省略该数组
sum=sum+min;
f[k]=;//表明f[k]元素已经用完,下次再碰到时直接跳过
for(j=;j<=m;j++)//最重要的一步,不解释
{
if((map[k][j]+min)<lowcost[j]&&f[j]==)//修改处1
{
lowcost[j]=map[k][j]+min;
g[j]=k;
}
}
}
return lowcost[m];//修改处2
}
int main()
{
while(scanf("%d%d",&m,&n)!=EOF)
{
int sum=;
int i,j;
for(i=;i<=;i++)
for(j=;j<=;j++)
map[i][j]=;//将map数组中的元素全部置为最大,表示各个节点之间无联系
for(i=;i<=n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(map[u][v]>w)//防止出现输入2 3 3,2 3 4这样的情况,所以要比较求出最小权值
{
map[u][v]=w;
map[v][u]=w;
}
}
sum=prim();
printf("%d\n",sum);
}
}
比较两部分代码,除了更新法则不同,其余代码部分基本上完全相同,但是两者的功能却完全不相同
图结构练习——最短路径(dijkstra算法(迪杰斯拉特))的更多相关文章
- SDUT OJ 图结构练习——最短路径 ( Floyed 算法 AND Dijkstra算法)
图结构练习——最短路径 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem ...
- 同步图计算实现最短路径Dijkstra算法
同上篇讲述pageRank一样,考虑一个顶点V. 根据顶点算法通常步骤1) 接收上个超步发出的入邻居的消息2) 计算当前顶点的值3) 向出邻居发消息 1.接收入邻居的消息 2.求入邻居的最小值,加上顶 ...
- 单源最短路径算法——Dijkstra算法(迪杰斯特拉算法)
一 综述 Dijkstra算法(迪杰斯特拉算法)主要是用于求解有向图中单源最短路径问题.其本质是基于贪心策略的(具体见下文).其基本原理如下: (1)初始化:集合vertex_set初始为{sourc ...
- 图结构练习——最短路径(floyd算法(弗洛伊德))
图结构练习——最短路径 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 给定一个带权无向图,求节点1到节点n的最短路径. 输 ...
- Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...
- 有向网络(带权的有向图)的最短路径Dijkstra算法
什么是最短路径? 单源最短路径(所谓单源最短路径就是只指定一个顶点,最短路径是指其他顶点和这个顶点之间的路径的权值的最小值) 什么是最短路径问题? 给定一带权图,图中每条边的权值是非负的,代表着两顶点 ...
- 最短路径-Dijkstra算法与Floyd算法
一.最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1 ADE:2 ADCE:3 ABCE:3 ②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径 ...
- 单源最短路径Dijkstra算法,多源最短路径Floyd算法
1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...
- 数据结构实验之图论七:驴友计划 ( 最短路径 Dijkstra 算法 )
数据结构实验之图论七:驴友计划 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...
随机推荐
- SQL Server 2008 R2安装图解教程
一.下载SQL Server 2008 R2安装文件 cn_sql_server_2008_r2_enterprise_x86_x64_ia64_dvd_522233.iso 二.将安装文件刻录成光盘 ...
- php类与对象
1.类与对象 对象:实际存在该类事物中每个实物的个体.$a =new User(); 实例化后的$a 引用:php的别名,两个不同的变量名字指向相同的内容 封装: 把对象的属性和方法组织在一个类(逻辑 ...
- discuzX3后台管理插件开发示例一 用户表查询
上次的入门已经介绍了后台管理插件开发的基本步骤,下面简单写一个示例查询一下用户表 需要已完成以下操作: 1.已创建test后台管理插件 //详见 http://www.cnblogs.com/savo ...
- crontab命令
前一天学习了 at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个 ...
- sharepoint2013隐藏左侧导航栏更换新的
$("#zz16_V4QuickLaunchMenu").hide()//隐藏 更换新的 <script type="text/javascript" s ...
- Appium+Robotframework实现Android应用的自动化测试-6:一个简单的例子
万事具备,只欠编码! 下面看一个简单的示例,这个示例验证Android手机自带的通讯录的添加联系人的操作是否成功.这个例子是Appium官网自带的示例,有兴趣的同学也可以自己下载来研究和学习,下载地址 ...
- response content-type json
2015年11月3日 15:47:43 百度知道:ajax开发中在请求服务器端的响应时, 对于每一种返回类型 规范的做法是要在服务端指定response的contentType 常遇到下面的几种情况: ...
- Win7下同时使用有线和无线时的优先级设置
终于找到这个问题的解决方案了!!!!我是通过方法1改跃点数实现的,方法2无效. http://linshengling.blog.163.com/blog/static/114651912012102 ...
- FFMpeg ver 20160213-git-588e2e3 滤镜中英文对照
1 FFMpeg ver 20160213-git-588e2e3 滤镜中英文对照 2016.02.18 by 1CM 2 T.. = Timeline support 3 支持时间轴 4 .S. = ...
- Python缩小图像
LyncLynn用途: 缩小图像 # -*- coding: UTF-8 -*- #Version: V1.0 #Author:lynclynn #CreateDate:20151201 #Updat ...