指定最短路经

啥也别说了,直入正题:有n个城市,m条路,  给你任意两个城市(n个城市中的任意2个),需要你求出这两个城市的最短路径。




输入格式:

给出第一行n和m(n<=100,m<=1000),n代表n个城市,m代表m条路,随后m行给出x,y,z三个数,x和y代表两个城市,z代表两城市之间的距离,最后一行给出要查询的两个城市

输出格式:

输出待查询两城市之间的最短路径

输入样例:

6 91 2 41 3 22 3 12 4 53 5 103 4 84 5 24 6 65 6 32 5

输出样例:

7

有两种算法可以解决这个题

一、Floyd最短路算法:

#include<bits/stdc++.h>
using namespace std;
const int N=1000;
int a[N][N];   //存放点和边的关系 
int n,m,x,y,z;
int inf=999999999;
void fun()
{
	for(int k=1;k<=n;k++)   //把任意两点之间最近的距离找出来存放到数组a中 
	{
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
			}
		}
	}
}
int main()
{
	int from,to;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)   //初始化点和边的关系,主对角线为0,其他点为inf 
	{
		for(int j=1;j<=i;j++)
		{
			if(i==j)
			{
				a[i][j]=0;
			}
			else
			{
				a[i][j]=a[j][i]=inf;
			}
		}
	}
	for(int i=1;i<=m;i++)    //存入两点一边 
	{
		cin>>x>>y>>z;
		a[x][y]=a[y][x]=z;
	}
	fun();             //把每一个点到其他点的距离都重新排到二维数组a中  
	scanf("%d%d",&from,&to);
	cout<<a[from][to]<<endl;   //输出从from点到to点的距离 
	return 0;
}

二、Dijkstra最短路算法:

#include<bits/stdc++.h>
using namespace std;
const int N=20;
int j,i,e[N][N],dis[N],vis[N],x,y,z,u,v,MIN,n,m;
int from,to;          //  从第几个   到第几个
int inf=999999999;      //定义表示最大数
void fun()
{
	for(i=1;i<=n;i++)
	{
		dis[i]=e[from][i];   //dis[i]存的是从from点到其他点的距离 ,现在只是初始化 
	}
	for(i=1;i<=n;i++)
	{
		vis[i]=0;            //初始化vis数组,让其都为0; 
	}
	vis[from]=1;             //让from点为1 
	for(i=1;i<=n-1;i++)
	{
		MIN=inf;
		for(j=1;j<=n;j++)      //每次都找出离from最近的点来,并且找出来的不再找 
		{
			if(vis[j]==0&&dis[j]<MIN)
			{
				MIN=dis[j];
				u=j;
			}
		}
		vis[u]=1;
		for(v=1;v<=n;v++)    //把找出来的点的最短路径存放到dis数组中 
		{
			if(e[u][v]<inf)  
			{
				if(dis[v]>dis[u]+e[u][v])
				{
					dis[v]=dis[u]+e[u][v];
				}
			}
		}
	}
}
int main()
{
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)     //用二维数组e来初始化顶点之间边的关系 
	{
		for(j=1;j<=n;j++)
		{
			if(i==j)
			{
				e[i][j]=0;       //主对角线为0 
			}
			else
			{
				e[i][j]=e[j][i]=inf;
			}
		}
	}
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		e[x][y]=e[y][x]=z;        //当成无向图来看待 
	}
	scanf("%d%d",&from,&to);
	fun();    //把每一个点到其他点的距离都存入到dis数组中 
	cout<<dis[to]<<endl;        //输出从from点到to点的距离
	return 0; 
}

内容概要:本文深入探讨了Kotlin语言在函数式编程和跨平台开发方面的特性和优势,结合详细的代码案例,展示了Kotlin的核心技巧和应用场景。文章首先介绍了高阶函数和Lambda表达式的使用,解释了它们如何简化集合操作和回调函数处理。接着,详细讲解了Kotlin Multiplatform(KMP)的实现方式,包括共享模块的创建和平台特定模块的配置,展示了如何通过共享业务逻辑代码提高开发效率。后,文章总结了Kotlin在Android开发、跨平台移动开发、后端开发和Web开发中的应用场景,展望了其未来发展趋势,指出Kotlin将继续在函数式编程和跨平台开发领域不断完善和发展。; 适合人群:对函数式编程和跨平台开发感兴趣的开发者,尤其是有一定编程基础的Kotlin初学者和中级开发者。; 使用场景及目标:①理解Kotlin中高阶函数和Lambda表达式的使用方法及其在实际开发中的应用场景;②掌握Kotlin Multiplatform的实现方式,能够在多个平台上共享业务逻辑代码,提高开发效率;③了解Kotlin在不同开发领域的应用场景,为选择合适的技术栈提供参考。; 其他说明:本文不仅提供了理论知识,还结合了大量代码案例,帮助读者更好地理解和实践Kotlin的函数式编程特性和跨平台开发能力。建议读者在学习过程中动手实践代码案例,以加深理解和掌握。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值