极其简单的最短路问题【BFS】【图论】
>Description
现在假设每条道路需要花费小X的时间为1,由于有数以万计的好朋友沿路祝贺,导致小X在通过某些路不得不耗费1的时间来和他们聊天,尽管他希望尽早见到小C,所以他希望找到一条最快时间到达电影院的路。
一开始小X在1号点,共有N个点,M条路,电影院为T号点。
>Input
第一行2个正整数,分别为n,m,t
以下m行,每行3个数,表示连接的编号以及权值
(注意,可能会有重边)
>Output
一行一个数,表示1到t的最短路
>Sample Input
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
>Sample Output
4
30%:n<=10 m<=20
60%: n<=1000 m<=20000
100%: n<=5000000 m<=10000000
>解题思路
原本打一个裸的SPFA可以得70分。
满分算法:
用BFS。因为路径长度不是1就是2,所以我们可以把2转化为1,也就是在一条权值为2的边上在加上一个点,使x->y,变成x->z->y,权值全部为1。这样每一条边的权值就是相等的了,变为谁先到t点谁就是最优的。
还要用快读。
>代码
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
struct ooo
{int to,next;
}a[40000005];
int n,m,t,x,y,z,tt,s,head,tail,h[10000005],st[10000005],c[10000005];
bool lhq[10000005];
char cc;
int input()
{int l=0;cc=getchar();while(cc<'0'||cc>'9') cc=getchar();while(cc>='0'&&cc<='9'){l=l*10+cc-'0';cc=getchar();}return l;
} //快读
int main()
{n=input(),m=input(),t=input();s=n; //s记录新建的点for(int i=1;i<=m;i++){x=input(),y=input(),z=input();if(z==1) //权值为1时直接连接{a[++tt].to=y; a[tt].next=h[x]; h[x]=tt;a[++tt].to=x; a[tt].next=h[y]; h[y]=tt; //连接x,y}else //为2时创点{s++;a[++tt].to=s; a[tt].next=h[x]; h[x]=tt;a[++tt].to=x; a[tt].next=h[s]; h[s]=tt; //连接x,sa[++tt].to=s; a[tt].next=h[y]; h[y]=tt;a[++tt].to=y; a[tt].next=h[s]; h[s]=tt; //连接s,y}}head=0; tail=1; st[1]=1; lhq[1]=1; //st为队列,lhq记录某点有没有走过while(head<tail){head++;for(int i=h[st[head]];i;i=a[i].next)if(!lhq[a[i].to]) //没有走过{st[++tail]=a[i].to; lhq[a[i].to]=1;c[a[i].to]=c[st[head]]+1; //加入队列if(a[i].to==t) //如果到了t,就直接输出{printf("%d",c[t]);return 0;}}}return 0;
}
极其简单的最短路问题【BFS】【图论】相关推荐
- 【bfs】极其简单的最短路问题
极其简单的最短路问题 题目大意: 求最短路,权值只有1或2 原题: 题目描述 小C终于被小X感动了,于是决定与他看电影,然而小X距离电影院非常远,现在假设每条道路需要花费小X的时间为1,由于有数以万计 ...
- 极其简单的最短路问题
极其简单的最短路问题 题目 小C终于被小X感动了,于是决定与他看电影,然而小X距离电影院非常远,现在假设每条道路需要花费小X的时间为1,由于有数以万计的好朋友沿路祝贺,导致小X在通过某些路不得不耗费1 ...
- 【BFS】【图论】极其简单的最短路问题
题目: 小C终于被小X感动了,于是决定与他看电影,然而小X距离电影院非常远,现在假设每条道路需要花费小X的时间为1,由于有数以万计的好朋友沿路祝贺,导致小X在通过某些路不得不耗费1的时间来和他们聊天, ...
- 2716: 极其简单的最短路问题(spfa裸题 or bfs)
一场游戏一场空,最终 最初都由我掌控,好像一身从容,不曾有狼狈伤痛,可深夜一个人该如何相拥? 题目描述 小C终于被小X感动了,于是决定与他看电影,然而小X距离电影院非常远,现在假设每条道路需要花费小X ...
- Flash Builder4.7极其简单破解方法-三步搞定(亲测)
资讯类型: 转载 来源页面: http://weibo.com/2101024913/yvmR0D9Df 资讯原标题: 资讯原作者: 丿卓越丶星辰 翻译词数: 词 我的评论: 对这篇文你有啥看法,跟贴 ...
- JQuery插件让图片旋转任意角度且代码极其简单 - 摘自网友
JQuery插件让图片旋转任意角度且代码极其简单 2012-04-01 09:57:03 我来说两句 收藏 我要投稿 引入下方的jquery.rotate.js文件,然后通过 ...
- 有自学能力的人,赚钱极其简单—来福宝盒
如果说一个人连一点自学能力都没有,想通过互联网做生意赚钱是非常难的. 一.自学能力是什么? 一个人吸收接纳事物的能力,更明确说一个人在没有接受指导和教育的情况下掌握某种技能.为什么要有自学能力? 有自 ...
- 一个极其简单的用golang net写的tcpip echoserver
一个极其简单的用golang net写的tcpip echoserver 关键字:linux golang tcpip echoserver 虽然然效率不是很理想,但是可以给初学者参考 package ...
- Flash Builder4.7极其简单破解方法-三步搞定
Flash Builder4.7极其简单破解方法-三步搞定(亲测) 原方法适用于4.6版本,同样方法4.7完美破解,不敢独享 具体步骤如下: 1.到Adobe官网下载FlashBuilder 4.6, ...
最新文章
- FFmpeg for ios架构:中级
- .9-浅析webpack源码之NodeEnvironmentPlugin模块总览
- 解决ckeditor富文本在layui 弹框中大小字体等下拉不显示
- Windows Phone 8初学者开发—第7部分:本地化应用程序
- vim怎么跳转到函数定义处_Vim、gvim操作跳转光标区块和代码块的跳转
- Delphi中一些DLL的运用。
- vue ---- 实现手机端(左滑 删除。右划 正常)
- Leetcode44. Wildcard Matching
- [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
- VSCode设置中文语言
- TCP/IP协议中IP数据保报文格式详解
- 解决 Evernote 印象笔记中代码语法高亮
- 机器是如何学习的?(监督式学习)
- SQL SERVER学习记录
- 苹果手机怎么看生产日期?参考方法在这!
- 慧据价值 链接未来丨第八届数据技术嘉年华大会全议程精彩呈现
- 微信小程序——点击文字出现编辑区域修改该文字
- laydate天蓝色皮肤
- 大仗的打法——推荐《智能商业》曾鸣的战略格局
- 用二分查找在一个有序数组中找数