HDU 2544

7人阅读 评论(0) 收藏 举报
分类:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int inf = 0x3f3f3f3f;
int d[1005];
int w[1005][1005];//存储地图,存储连通关系
int vis[1005];
int n, m;
void dij(int x)
{
	for (int i = 1; i <= n; i++)
		d[i] = inf;
	memset(vis, 0, sizeof(vis));
	d[x] = 0;
	for (int i = 1; i <= n; i++)
	{
		int min = inf;
		int k = 0;
		for (int j = 1; j <= n; j++)
		{
			if (!vis[j] && d[j] < min)
			{
				k = j;
				min = d[j];//寻找最短的距离
			}
		}
		vis[k] = 1;
		for (int j = 1; j <= n; j++)
		{
			if (!vis[j] && min + w[k][j] < d[j])
				d[j] = min+w[k][j];
		}
	}
}
int main()
{
	while (cin>>n>>m)
	{
		if (n == 0 && m == 0)
			break;
		for (int i = 1; i <= n; i++)
		{
			w[i][i] = inf;//相同两点之间的距离定位无穷大
			for (int j = i+1; j <=n; j++)//遍历一遍
			{
				w[i][j] = w[j][i] = inf;//注意算法的初始化
			}
		}
		for (int i = 0; i < m; i++)
		{
			int a, b, dis;
			cin >> a >> b >> dis;//输入图之间的关系
			w[a][b] = w[b][a] = dis;
		}
		dij(1);
		printf("%d\n", d[n]);

	}

}

1、理解迪杰斯特拉算法,有几个关键地方,首先,对于无连通关系的点,之间的距离定为无穷大,进行图的连通时,注意两边的距离的记录,其次,注意理解d[n]数组的含义,代表从起点到当前顶点的最短距离
2、只有存在连通关系的点才能够被更新,更新之后便于第二次循环时找到该点,其他未被更新的点仍处于无穷大的状态,所以利用不断更新的办法,依次进行寻找行进的顶点,在此处注意引入vis数组,用于记录该顶点是否已经被访问,所以每次在寻找最小值时,总能保证找出的最小值为起点到当前顶点的最短距离,类似于dp思想,每次进行更新直到更新至起点到终点的最短距离
int dijkstra(int n)
{
    //初始化v[0]到v[i]的距离
    for(int i=1;i<=n;i++)
        dis[i] = w[0][i];                                       
    vis[0]=1;//标记v[0]点
    for(int i = 1; i <= n; i++)
    {
        //查找最近点
        int min = INF,k = 0;
        for(int j = 0; j <= n; j++)
            if(!vis[w] && dis[j] < min)
                min = dis[w],k = j;
        vis[k] = 1;//标记查找到的最近点
        //判断是直接v[0]连接v[j]短,还是经过v[k]连接v[j]更短
        for(int j = 1; j <= n; j++)
            if(!vis[j] && min+w[k][j] < dis[j])
                d[j] = min+w[k][j];
    }
    return dis[j];
}
以上为迪杰斯特拉算法实现的模板

查看评论

HDU-2544 最短路【最短路】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544 最近复习了最短路径的算法,就写了4个版本的测试。正好是模板题,就果断A之。。。 Di...
  • niushuai666
  • niushuai666
  • 2012-02-25 09:31:02
  • 2442

ACM-最短路(SPFA,Dijkstra,Floyd)之最短路——hdu2544

ACM 最短路(SPFA,Dijkstra,Floyd) 最短路 hdu2544
  • lx417147512
  • lx417147512
  • 2014-05-27 11:59:54
  • 3743

hdu2544 最短路(三种基本最短路算法)

http://acm.hdu.edu.cn/showproblem.php?pid=2544 题意:中文题求最短路。无负值。 思路:主要是用来熟悉三种基本最短路算法。先来整体教程。总体...
  • Flynn_curry
  • Flynn_curry
  • 2016-01-19 16:24:29
  • 515

hdu 2544 最短路(Dijkstra 邻接表+优先队列)

题目地址 http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Time Limit: 5000/1000 MS (Java/Others...
  • sinat_30126425
  • sinat_30126425
  • 2015-09-15 21:18:18
  • 496

hdu2544 最短路 Dijstra算法堆优化,Bellman-Ford,Bellman-Ford队列优化

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis...
  • EventQueue
  • EventQueue
  • 2016-03-04 16:41:20
  • 685

hdu2544 最短路(dijkstra/优先队列)

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm...
  • su20145104009
  • su20145104009
  • 2015-07-13 10:08:13
  • 1483

HDU 2544 最短路【Dijkstra算法、spfa算法】

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis...
  • hurmishine
  • hurmishine
  • 2016-05-07 22:09:36
  • 1630

[HDU 2544] 最短路 spfa写法 + 链式前向星

spfa是对迪杰斯特拉算法的队列优化,套路大概就是: 让dis[1] 入队, 然后判断队列是否为空; 让它赋给队首, 然后就是一样的循环; 唯一的区别就是这个地方!vis[i] 是拆开放在后面的; ...
  • qq_33638791
  • qq_33638791
  • 2016-05-11 10:43:55
  • 406

最短路 SPFA 判断负环 静态邻接表(链式前向星) HDU 2544 最短路 POJ 3259 Wormholes

HDU 2544 最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) P...
  • nonstop_running
  • nonstop_running
  • 2017-03-21 20:35:05
  • 121

HDU 2544 最短路(Floyd + Dijkstra + SPFA + 使用链式前向星优化的SPFA + 浅谈最短路)

自己最近状态莫名浮躁,有点急于求成了,鹏哥讲的最短路和最小生成树我都只会写最简单的算法,这么下去题是做多了,水平也不会有什么提高,强迫自己多去练习和掌握更好的方法吧 这里写一道最短路水题的多种实现 ...
  • qq_41444888
  • qq_41444888
  • 2018-01-27 19:30:42
  • 66
    个人资料
    持之以恒
    等级:
    访问量: 400
    积分: 227
    排名: 26万+
    文章存档