畅通工程续(Dijkstra算法)
对Dijkstra算法不是很熟悉,写一下思路,希望通过写博客加深理解
Description
现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。
Input
每组数据第一行包含两个正整数N和M(0<N<200,0<M<1000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以0~N-1编号。
接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B<N,A!=B,0<X<10000),表示城镇A和城镇B之间有一条长度为X的双向道路。
再接下一行有两个整数S,T(0<=S,T<N),分别代表起点和终点。
Output
Sample Input
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2
#include <stdio.h>
#define M 210
#define INF 0x3f3f3f
int arr[M][M], vis[M], dis[];
int n, m;
void Dijkstra(int src)
{
for(int i = ; i < n; i++)
{
vis[i] = ;
dis[i] = arr[src][i];
}
int tmp, k;
vis[src] = ;
dis[src] = ;
for(int i = ; i < n; i++)
{
tmp = INF;
for(int j = ; j < n; j++)
{
if(!vis[j] && tmp > dis[j])
{
tmp = dis[j];
k = j;
}
}
vis[k] = ;
for(int j = ; j < n; j++)
{
if(!vis[j] && dis[j] > arr[k][j] + dis[k])
dis[j] = arr[k][j] + dis[k];
}
}
}
int main()
{
int s, t, u, v, w;
while(~scanf("%d%d", &n, &m))
{
for(int i = ; i < n; i++)
{
for(int j = ; j < n; j++)
arr[i][j] = INF;
}
for(int i = ; i < m; i++)
{
scanf("%d%d%d", &u, &v, &w);
if(arr[u][v] > w)
arr[u][v] = arr[v][u] = w;
}
scanf("%d%d", &s, &t);
Dijkstra(s);
if(dis[t] == INF)
printf("-1\n");
else
printf("%d\n", dis[t]);
}
return ;
}
上一个代码是我以前参考别人的代码写的,今天又看了这道题,自己写了代码
刚开始一直wrong answer ,竟然一直找不到原因,后来发现我没有考虑从本城市到本城市的情况,初始化的时候arr[i][i] = 0
因为这个,wrong answer 10发,真是醉了
/*
问题:假设所有城市编号0到n-1,给出城市的数目n,已经修的路的数目m,m行给出m条路中a城和b成的距离x
输入出发城市s和目标城市t,问从出发城市到目标城市的最短路线
如果没有路,输出-1
分析:把出发的点s带入Dijkstra算法进行计算,算出所有点到src的最短距离,输出arr[src][t]即可
代码块1:初始化
1:把所有点之间的距离初始化为无穷,
2:别忘了把自己到自己的距离初始化为0(因为这个原因wrong answer 10 发,真的够了)
3:录入输入的城市a到城市b的距离x,如果x小于原本存储的arr[a][b](也就是a城市到b城市的距离)那么就更新a城市到b城市的距离
代码块2:Dijkstra算法:
1:把所有的城市标记为临时的
2:共有n个城市,先把出发的城市标记为永久的,因为每次把一个城市标记为临时的所以还要循环n-1次来标记其他的城市,直到所有城市都为永久
3:每次的循环中找到所有城市中距离起点最近的城市k,并把这个城市标记为永久,更新其他所有城市,假设为"i"到到起点的距离为min(arr[s][k]+arr[k][i], arr[s][i]);
这样就找到了所有城市距离起点s的最短距离,输出arr[s][t]即可
*/
代码2:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define M 1000+10
#define INF 0x3f3f3f
using namespace std;
int arr[M][M];
bool vis[M];
int n, m;
void Init()
{
int a, b, x;
for(int i = ; i < n; i++)
for(int j = ; j < n; j++)
arr[i][j] = INF;
for(int i = ; i < n; i++)
arr[i][i] = ;
for(int i = ; i < m; i++)
{
scanf("%d%d%d", &a, &b, &x);
if(x < arr[a][b])
arr[a][b] = arr[b][a] = x;
}
}
void Dijkstra(int src)
{
int tmp, k;
memset(vis, , sizeof(vis));
vis[src] = ;
arr[][] = ;
for(int i = ; i < n; i++)
{
tmp = INF;
for(int j = ; j < n; j++)
{
if(arr[src][j] < tmp && !vis[j])
{
tmp = arr[src][j];
k = j;
}
}
vis[k] = ; //把找到的那个点标记为永久
for(int j = ; j < n; j++)
{
if(arr[src][k]+arr[k][j] < arr[src][j])
arr[src][j] = arr[src][k] + arr[k][j];
}
}
}
int main()
{
int s, t;
//freopen("input.txt", "r", stdin);
while(~scanf("%d%d", &n, &m))
{
Init();
scanf("%d%d", &s, &t);
Dijkstra(s);
if(arr[s][t] != INF)
printf("%d\n", arr[s][t]);
else
printf("-1\n");
}
return ;
}
畅通工程续(Dijkstra算法)的更多相关文章
- ACM: HDU 1874 畅通工程续-Dijkstra算法
HDU 1874 畅通工程续 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Desc ...
- HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题
参考 此题Dijkstra算法,一次AC.这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科): 附上: 迪科斯彻算法分解(优酷) problem link -> HDU 1874 ...
- hdu 1874 畅通工程续 Dijkstra
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 题目分析:输入起点和终点,顶点的个数,已连通的边. 输出起点到终点的最短路径,若不存在,输出-1 ...
- 畅通工程续 (dijkstra)
畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- hdu 1874 畅通工程续 (dijkstra(不能用于负环))
畅通工程续Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu1874畅通工程续 (dijkstra)
Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行 ...
- hdu 1874 畅通工程续(求最短距离,dijkstra,floyd)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 /************************************************* ...
- 畅通工程续——E
E. 畅通工程续 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多.这让 ...
- hdoj 1874 畅通工程续【dijkstra算法or spfa算法】
畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
随机推荐
- QT中QWidget、QDialog及QMainWindow的区别
本文转自http://www.cnblogs.com/aqxin/archive/2011/05/23/2054156.html QWidget类是所有用户界面对象的基类. 窗口部件是用户界面的一个基 ...
- BZOJ 1997: [Hnoi2010]Planar( 2sat )
平面图中E ≤ V*2-6.. 一个圈上2个点的边可以是在外或者内, 经典的2sat问题.. ----------------------------------------------------- ...
- FASTCGI程序,做个备份,以后用
11FastCGI 用来作为 Web 服务器的设计方案,有着很多优点.要搭建这样一个服务,有一个最简单的办法来搭建,可以使用 Apache 以及 mod_fcgid 模块来实现. 鉴于网上有关 Fas ...
- 网页往数据库里插数据要用utf8,否则就乱码
把网页的这行<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ...
- 微信上传素材返回 '{"errcode":41005,"errmsg":"media data missing"}',php5.6返回
问题描述: php5.5已经把通过@加文件路径上传文件的方式给放入到Deprecated中了.php5.6默认是不支持这种方式了 解决办法curl处理 function curl_post($url, ...
- c语言各类问题 代码
定义一个结构体,有两个成员变量,一个整型的n,一个字符型的c,利用结构体类型声明一个具有5个元素的数组,并随机初始化,根据成员变量n进行从小到大排序,然后输出 冒泡排序然后 在输出结构体#includ ...
- 远程管理服务SSHD
安装SSH yum install openssh
- (C#)Windows Shell 编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令
原文(C#)Windows Shell 编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) 接上一节:( ...
- activemq在windows下启动报错,闪退问题
查验了网上各种方法,都没搞定,最后楼主决定按照linux的解决套路来,把windows计算机名称改为纯英文字母,原计算机名:lee_pc,修改后为leepc,然后重启电脑,再重新运行activemq. ...
- libcurl的使用问题“Expect100-continue”
最近在做团购酒店APP分享到qzone功能,使用libcurl访问qzone的分享cgi接口,酒店分享信息以POST方式传输,在测试的时候发现分享接口平均有2s的延迟,这延迟也太大了吧,于是乎问了空间 ...