【例题 6-20 UVA - 1599】Ideal Path
【链接】 我是链接,点我呀:)
【题意】
在这里输入题意
【题解】
逆向做一遍bfs.
得到终点到某个点的最短距离。
这样,我们从起点顺序的时候。
就能知道最短路的下一步是要走哪里了。
这样,我们从起点也开始做一遍bfs.
然后根据逆序的bfs得知下一步该往哪些点走。
每次优先走最小的字典序边即可。
多个最小的,就每个都走一遍试试。
6 6
1 2 3
1 3 3
2 4 5
3 5 1
4 6 1
5 6 100
ans = 3->1->100
↑↑这组数据可以hack网上好多人(>=1)的做法,数据里没有这组。
如果出现前一段路不是最小字典序了,就要结束这一段路了,不能继续往下走。
(或者,这样说,字典序最小的最短路不会到x这个节点来,那么就不能从x再继续往下走了)
【代码】
/*
1.Shoud it use long long ?
2.Have you ever test several sample(at least therr) yourself?
3.Can you promise that the solution is right? At least,the main ideal
4.use the puts("") or putchar() or printf and such things?
5.init the used array or any value?
6.use error MAX_VALUE?
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
int n,m,dis[N+10];
int vis[N+10];
vector < pair<int,int> > g[N+100];
queue <int> dl;
int a[N+10];
int main(){
#ifdef LOCAL_DEFINE
freopen("F:\\c++source\\rush_in.txt", "r", stdin);
#endif
ios::sync_with_stdio(0),cin.tie(0);
while (cin >> n >> m){
memset(vis,0,sizeof vis);
for (int i = 1;i <= n+1;i++) a[i] = (int) 1e9+7;
for (int i = 1;i <= n;i++) g[i].clear();
for (int i = 1;i <= m;i++){
int x,y,z;
cin >>x>>y>>z;
g[x].push_back(make_pair(y,z));
g[y].push_back(make_pair(x,z));
}
memset(dis,255,sizeof dis);
dis[n] = 0;
dl.push(n);
while (!dl.empty()){
int x = dl.front();
dl.pop();
for (int i = 0;i < (int)g[x].size();i++){
int y = g[x][i].first;
if (dis[y]==-1){
dis[y] = dis[x] + 1;
dl.push(y);
}
}
}
vis[1] = 1;
dl.push(1);
while (!dl.empty()){
int x = dl.front();
dl.pop();
if (vis[x]>a[dis[x]+1]) continue; //vis[x]就是路径中到x的前一条边的最小权值,如果它不是前一条边的最小字典序就跳过
int mi = (int) 1e9 + 10;
for (int i = 0;i < (int) g[x].size();i++){
int y = g[x][i].first;
if (dis[y]==dis[x]-1){
mi = min(mi,g[x][i].second);
}
}
a[dis[x]] = min(mi,a[dis[x]]);
for (int i = 0;i < (int) g[x].size();i++){
int y = g[x][i].first;
if (dis[y]==dis[x]-1 && g[x][i].second==mi){
if (!vis[y]) dl.push(y);
if(!vis[y] || vis[y]>mi) vis[y] = mi;
}
}
}
cout << dis[1] << endl;
for (int i = dis[1];i >= 1;i--) {
cout << a[i];
if (i==1) cout << endl;else cout << ' ';
}
}
return 0;
}
【例题 6-20 UVA - 1599】Ideal Path的更多相关文章
- UVA 1599 Ideal Path (HDU 3760)
两次bfs: 第一次bfs逆向搜索,得到每个点到终点的最短距离,找出最短路:第二次bfs根据最短距离可以选择满足条件的最短路. 注意!碰到这种很大数据量的题目一定要记得用scanf,printf 输入 ...
- UVA 1599 Ideal Path(双向bfs+字典序+非简单图的最短路+队列判重)
https://vjudge.net/problem/UVA-1599 给一个n个点m条边(2<=n<=100000,1<=m<=200000)的无向图,每条边上都涂有一种颜色 ...
- uva 1599 ideal path(好题)——yhx
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGYAAAODCAYAAAD+ZwdMAAAgAElEQVR4nOy9L8/0ypH/Pa8givGiyC
- UVA 1599 Ideal Path(bfs1+bfs2,双向bfs)
给一个n个点m条边(<=n<=,<=m<=)的无向图,每条边上都涂有一种颜色.求从结点1到结点n的一条路径,使得经过的边数尽量少,在此前提下,经过边的颜色序列的字典序最小.一对 ...
- UVA 1599 Ideal Path
题意: 给出n和m,n代表有n个城市.接下来m行,分别给出a,b,c.代表a与b之间有一条颜色为c的道路.求最少走几条道路才能从1走到n.输出要走的道路数和颜色.保证颜色的字典序最小. 分析: bfs ...
- Uva 1599 Ideal Path - 双向BFS
题目连接和描述以后再补 这题思路很简单但还真没少折腾,前后修改提交了七八次才AC...(也说明自己有多菜了).. 注意问题: 1.看清楚原题的输入输出要求,刚了书上的中文题目直接开撸,以为输入输出都是 ...
- 【每日一题】 UVA - 1599 Ideal Path 字典序最短路
题解:给一个1e5个点2e5条边,每个边有一个值,让你输出一条从1到n边的路径使得:条数最短的前提下字典序最小. 题解:bfs一次找最短路(因为权值都是1,不用dijkstra),再bfs一次存一下路 ...
- UVa 1599 Ideal Path (两次BFS)
题意:给出n个点,m条边的无向图,每条边有一种颜色,求从结点1到结点n颜色字典序最小的最短路径. 析:首先这是一个最短路径问题,应该是BFS,因为要保证是路径最短,还要考虑字典序,感觉挺麻烦的,并不好 ...
- UVa 1599 Ideal Path【BFS】
题意:给出n个点,m条边,每条边上涂有一个颜色,求从节点1到节点n的最短路径,如果最短路径有多条,要求经过的边上的颜色的字典序最小 紫书的思路:第一次从终点bfs,求出各个节点到终点的最短距离, 第二 ...
随机推荐
- 进阶《Python高性能编程》中文PDF+英文PDF+源代码
入门使用高性能 Python,建议参考<Python高性能编程>,例子给的很多,讲到高性能就会提到性能监控,里面有cpu mem 方法的度量,网络讲了一点异步,net profiler 没 ...
- Python excel 功能扩展库 ——> openpyxl 的基本使用
说明:本文档内容参考自 https://www.cnblogs.com/zeke-python-road/p/8986318.html (作者:关关雎鸠`)的文档 from openpyxl impo ...
- Ajax学习总结(1)——Ajax实例讲解与技术原理
摘要:AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.AJAX 是一种用 ...
- 最近学习了一下DeepLearning,发现时NB。
持续关注,有空放个算法到线上的推荐上.
- swift 编译提前定义 --不知道怎么定义,可是能够#if
var v:Int; #if _COND//不知道怎么定义.可是能够#if v = ; #else ; #endif println(v);//2
- [ES6] The Iterator Protocol
The iterator protocol is used to define a standard way that an object produces a sequence of values. ...
- 我的RTOS 之二 --Threadx在skyeye上仿真測试(基于2410)
对于RTOS 移植来说,移植平台至少要提供双方面的设备. 1.OS执行时,须要tick,所以须要提供Timer定时器 2.OS执行时,须要调度,就是挂起当前线程,把控制权交给系统,所以须要訪问系统各个 ...
- jQuery11 data() : 数据缓存
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- Fragment-Transaction 源码分析
概述 这篇文章的简要分析了Activity中的Transaction和add,replace等操作以及backstack的工作原理. 分析transaction源码的原因是因为我在写一个测试代码的时候 ...
- Atcoder ABC 070 B、C、D
B - Two Switches Time limit : 2sec / Memory limit : 256MB Score : 200 points Problem Statement Alice ...