【BFS】极其简单的最短路问题

题目描述

小C终于被小X感动了,于是决定与他看电影,然而小X距离电影院非常远,现在假设每条道路需要花费小X的时间为1,由于有数以万计的好朋友沿路祝贺,导致小X在通过某些路不得不耗费1的时间来和他们聊天,尽管他希望尽早见到小C,所以他希望找到一条最快时间到达电影院的路。
一开始小X在1号点,共有N个点,M条路,电影院为T号点。

输入

第一行2个正整数,分别为n,m,t
以下m行,每行3个数,表示连接的编号以及权值
(注意,可能会有重边)

输出

一行一个数,表示1到t的最短路

输入样例
10 12 6
3 9 2
6 9 2
6 2 1
3 1 1
1 9 2
2 8 2
7 10 1
7 2 1
10 0 1
8 1 1
1 5 2
3 7 2
输出样例
4

说明

30%:n<=10 m<=20
60%: n<=1000 m<=20000
100%: n<=5000000 m<=10000000

思路

这道题 S P F A SPFA SPFA只能拿80分
加快读90分
但是本题正解:BFS
我们由题可得每条边的权值要么1要么2
所以我们可以遇到边权为2时
加一个点,连接起点到新点
边权为1
连接新点与终点
边权为1
B F S BFS BFS
因为边权相等
就保证了第一次遇见 t t t就是最优的

#include<Algorithm>
#include<Iostream>
#include<Cstring>
#include<Cstdio>
#include<Cmath>
#include<Queue>
#define rr register
using namespace std;
int Ans[10000250],h[10000250],Bol[10000250];
int T,n,m,t,tt,x,s,y;
struct whw
{
	int w,h,s;
}wh[10000250];
void hw(int x,int s,int y)
{wh[++t]=(whw){s,h[x],y};h[x]=t;}
int read()
{
	int z=0,flag=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')flag=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){z=z*10+ch-'0';ch=getchar();}
	return z*flag;
}
void Bfs()
{
	memset(Ans,0x3f,sizeof(Ans));
	queue<int>xsy;
	xsy.push(1);
	Bol[1]=1;
	Ans[1]=0;
	while(xsy.size())
	{
		x=xsy.front();
		xsy.pop();
		for(rr int i=h[x];i;i=wh[i].h)
			if(!Bol[wh[i].w])
			{
				Ans[wh[i].w]=wh[i].s+Ans[x];
				Bol[wh[i].w]=1;
				xsy.push(wh[i].w);
				if(wh[i].w==T)
				{
					printf("%d",Ans[wh[i].w]);
					return;
				}
			}
	}
}
int main()
{
	n=read();m=read();T=read();
	for(rr int i=1;i<=m;++i)
	{
		x=read();s=read();y=read();
		if(y==1)//如果边权为1
		{hw(x,s,y);hw(s,x,y);}//直接连接无向边
		else if(y==2)//如果为2
		{hw(x,n+(++tt),1);hw(n+tt,s,1);
		hw(n+tt,x,1);hw(s,n+tt,1);}//就设新点
	}
	Bfs();
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于移动设备,如智能手机和平板电脑。该系统最初由安迪·鲁宾开发,后被Google公司收购并注资,随后与多家硬件制造商、软件开发商及电信营运商共同研发改良。 Android操作系统的特点包括: 开放源代码:Android系统采用开放源代码模式,允许开发者自由访问、修改和定制操作系统,这促进了技术的创新和发展,使得Android系统具有高度的灵活性和可定制性。 多任务处理:Android允许用户同时运行多个应用程序,并且可以轻松地在不同应用程序之间切换,提高了效率和便利性。 丰富的应用生态系统:Android系统拥有庞大的应用程序生态系统,用户可以从Google Play商店或其他第三方应用市场下载和安装各种各样的应用程序,满足各种需求。 可定制性:Android操作系统可以根据用户的个人喜好进行定制,用户可以更改主题、小部件和图标等,以使其界面更符合个人风格和偏好。 多种设备支持:Android操作系统可以运行在多种不同类型的设备上,包括手机、平板电脑、智能电视、汽车导航系统等。 此外,Android系统还有一些常见的问题,如应用崩溃、电池耗电过快、Wi-Fi连接问题、存储空间不足、更新问题等。针对这些问题,用户可以尝试一些基本的解决方法,如清除应用缓存和数据、降低屏幕亮度、关闭没有使用的连接和传感器、限制后台运行的应用、删除不需要的文件和应用等。 随着Android系统的不断发展,其功能和性能也在不断提升。例如,最新的Android版本引入了更多的安全性和隐私保护功能,以及更流畅的用户界面和更强大的性能。此外,Android系统也在不断探索新的应用场景,如智能家居、虚拟现实、人工智能等领域。 总之,Android系统是一种功能强大、灵活可定制、拥有丰富应用生态系统的移动操作系统,在全球范围内拥有广泛的用户基础。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值