ZJNU数据结构1014 实验六 单源最短路Dijkstra算法 HDU1874 畅通工程续

题目描述

    某省自实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。
    现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。

输入

    本题目包含多组数据,请处理到文件结束。
    每组数据第一行包含两个正整数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),分别代表起点和终点。

输出

    对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出 -1.

样例输入

3 3

0 1 1

0 2 3

1 2 1

0 2

3 1

0 1 1

1 2

样例输出

2

-1

来源

    2008年浙大研究生复试热身赛(2)----全真模拟

hint

该解法为dijkstra算法,效率较高,本题还可以使用floyd算法来进行求解(时间较长)

代码区:

#include <iostream>
#include <string.h>
#include <cmath>
#include <cstdio>
using namespace std;
int n,m,map[205][205];//map数组为两个城市之间的距离
int p[205];
void init()//初始化函数
{
    memset(map,0x3f3f3f3f,sizeof(map));//初始化map数组,将每个城市之间的距离定义为无限大,即断路
	memset(p,0,sizeof(p));//初始化数组为0
	for(int i=0;i<n;i++)
        map[i][i]=0;//将所有存在的城市自己与自己之间距离设置为0
}
int dijkstra(int a,int b)//算法核心函数,返回一个值表示两地之间最短路径
{
	if(a==b) return 0;//当所求两地为同一个城市时,输出0
	while(1)//循环进行,直到里面有break出现
    //该循环作用为循环不断比较对于新的f来找到最小的a到f,f到b的路径长度
	{
		int t=0x3f3f3f3f+1;//t初始设为比无限大还要大的数,以便下方进行第一次min赋值
		int f=-1;//标记变量
		for(int j=0;j<n;j++)//找a到其他城市的最短路径
		if(!p[j]&&map[a][j]<t)//当发现a到j的距离小于最小值时且该城市没标记过时
		{
			t=map[a][j];//将此时的路程存入t最小路径中,t为a到f的最短路径
			f=j;//记下a到其他城市最短路线的下标为f
		}
        if(f==-1)break;//当所有城市都被标记过了f就不会被赋新值所以还是-1,此时跳出循环
		p[f]=1;//标记说明这个城市是a到达的最小路径城市,下方动态规划时应跳过该处以免使min数据为0
		for(int j=0;j<n;j++)
		if(!p[j])map[a][j]=min(map[a][j],t+map[f][j]);
		//当还是a到j的距离短时取该值,所以保持不变。如果a到f加上f到j的路径比较小,就取
		//动态规划的思维,不断循环,最后map[a][b]的路线就会是最短路径
	}
	if(map[a][b]==0x3f3f3f3f)return -1;//当a和b两城市不通时,两地map值为无限大,输出-1
	return map[a][b];
}
int main()
{
    int a,b,c;
	while(cin >> n >> m)//输入城市个数和道路个数
	{
		init();//初始化
		int x,y,ans;
		for(int i=0;i<m;i++)
		{
			cin >> a >> b >> c;//依次输入道路两头城市和道路长度
			map[a][b]=min(map[a][b],c);//可能存在多条道路连通两座城市,此处记下最短路
			map[b][a]=min(map[b][a],c);//可能存在多条道路连通两座城市,此处记下最短路
			//因为道路是两通的,所以a到b和b到a的路程是一样的
		}
		cin >> x >> y;//输入起点和终点
		if(x>y)swap(x,y);//确保起点城市号小于终点城市号
		ans=dijkstra(x,y);//调用dijkstra函数求出最短路径
		cout << ans << endl;
	}
	return 0;
}

新手上路,有错请指正

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Khalil三省

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值