图结构练习——最短路径
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 ...
随机推荐
-
MySqlHelper
package utils; import java.io.IOException; import java.sql.CallableStatement; import java.sql.Connec ...
-
Dedecms v5.7 最新注入分析
该漏洞是cyg07在乌云提交的, 漏洞文件: plus\feedback.php.存在问题的代码: view source 01 ... 02 if($comtype == 'comments') 0 ...
-
【BZOJ 1597】 [Usaco2008 Mar]土地购买 (斜率优化)
1597: [Usaco2008 Mar]土地购买 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3601 Solved: 1322 Descrip ...
-
hdu2002
import java.util.*;class Main{public static void main(String args[]){Scanner cin=new Scanner(System. ...
-
sql uniqueidentifier转varchar
--- DECLARE @myid uniqueidentifierSET @myid = NEWID()SELECT CONVERT(char(255), @myid) AS 'char';GO-- ...
-
[置顶] 【IOS】IOS7 UI适配
昨天下了把手机升级成了IOS7 正式版,然后下了最新的xocde5. 试着编译了一下刚刚完成的几个应用,还好问题不大,半个小时的时间都适配好了,然后改了下几个新出现的warning.过几天等空了,要 ...
-
MySQL 误删用户
误删除root用户&误删除所有用户 #----------------------------------------------------------------------------- ...
-
配置zabbix_server通过zabbix_proxy进行监控Host
zabbix_server添加proxy并监控主机 zabbix分布式监控系统安装配置:http://www.cnblogs.com/LuckWJL/p/9037007.html 安装配置zabbix ...
-
cocos2d-x3.1 下实现相似Android下ExpandListView的效果
在左Android開始有SDK提供ExpandListView的可扩展列表,而在iOS下有很多第三方做好的Demo,这里我是參照iOS下RATreeView这个第三方库实现的. 本文代码:须要在3.1 ...
-
[转]认识session
今天想用一个session来实现用户登录判断,也算是对之前session的探究,查了下资料session的运行机制如下: session是服务器端的一种会话机制,当客户端的请求服务器创建一个sessi ...