【链接】 我是链接,点我呀:)

【题意】

在这里输入题意

【题解】

逆向做一遍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的更多相关文章

  1. UVA 1599 Ideal Path (HDU 3760)

    两次bfs: 第一次bfs逆向搜索,得到每个点到终点的最短距离,找出最短路:第二次bfs根据最短距离可以选择满足条件的最短路. 注意!碰到这种很大数据量的题目一定要记得用scanf,printf 输入 ...

  2. UVA 1599 Ideal Path(双向bfs+字典序+非简单图的最短路+队列判重)

    https://vjudge.net/problem/UVA-1599 给一个n个点m条边(2<=n<=100000,1<=m<=200000)的无向图,每条边上都涂有一种颜色 ...

  3. uva 1599 ideal path(好题)——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGYAAAODCAYAAAD+ZwdMAAAgAElEQVR4nOy9L8/0ypH/Pa8givGiyC

  4. UVA 1599 Ideal Path(bfs1+bfs2,双向bfs)

    给一个n个点m条边(<=n<=,<=m<=)的无向图,每条边上都涂有一种颜色.求从结点1到结点n的一条路径,使得经过的边数尽量少,在此前提下,经过边的颜色序列的字典序最小.一对 ...

  5. UVA 1599 Ideal Path

    题意: 给出n和m,n代表有n个城市.接下来m行,分别给出a,b,c.代表a与b之间有一条颜色为c的道路.求最少走几条道路才能从1走到n.输出要走的道路数和颜色.保证颜色的字典序最小. 分析: bfs ...

  6. Uva 1599 Ideal Path - 双向BFS

    题目连接和描述以后再补 这题思路很简单但还真没少折腾,前后修改提交了七八次才AC...(也说明自己有多菜了).. 注意问题: 1.看清楚原题的输入输出要求,刚了书上的中文题目直接开撸,以为输入输出都是 ...

  7. 【每日一题】 UVA - 1599 Ideal Path 字典序最短路

    题解:给一个1e5个点2e5条边,每个边有一个值,让你输出一条从1到n边的路径使得:条数最短的前提下字典序最小. 题解:bfs一次找最短路(因为权值都是1,不用dijkstra),再bfs一次存一下路 ...

  8. UVa 1599 Ideal Path (两次BFS)

    题意:给出n个点,m条边的无向图,每条边有一种颜色,求从结点1到结点n颜色字典序最小的最短路径. 析:首先这是一个最短路径问题,应该是BFS,因为要保证是路径最短,还要考虑字典序,感觉挺麻烦的,并不好 ...

  9. UVa 1599 Ideal Path【BFS】

    题意:给出n个点,m条边,每条边上涂有一个颜色,求从节点1到节点n的最短路径,如果最短路径有多条,要求经过的边上的颜色的字典序最小 紫书的思路:第一次从终点bfs,求出各个节点到终点的最短距离, 第二 ...

随机推荐

  1. CetnOS6 网络配置,主机名配置

    CetnOS6 网络配置,主机名配置 一.通过命令ifconfig -a 查看可用网络设备 二.通过网络配置文件/etc/sysconfig/network-scripts/ifcfg-eth0 配置 ...

  2. express随笔

    Express 是node 第三方框架,框架的意义就在于能大大简化程序地开发.看一下Express是怎么简化node程序开发的. 1,用Express写一个hello world 程序,我们来体验一下 ...

  3. 昼猫笔记 -- 面向对象(II) - 继承

    继承 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念. 所以,要想实现继承,可以用js的原型prototype机制或者用apply和call方法去实现,还有就是js可以 ...

  4. 海思平台服务器版软件V15.2产品发布

    深度操作系统海思平台服务器版软件是武汉深之度科技有限公司发布的针对华为海思平台的TaiShan系列服务器发布的企业级服务器操作系统软件产品,主要面向企业级服务器应用场景,为用户在国产化平台上提供更具可 ...

  5. 【Henu ACM Round #13 D】A Trivial Problem

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 123...n中末尾0的个数 只会由素因子2和5的个数决定且等于 Min{cnt[2],cnt[5]} 且素因子2的个数一定会比5多 ...

  6. Hello World (记事本+命令行)

    读完这篇博客.你将对下面几点更有心得: - Java 中的当前路径.类路径等概念 - javac.java 命令的综合使用 - jar 包的创建及引用 创建文件夹准备測试源代码 打包外部依赖 Jar ...

  7. Android 学习笔记之Bitmap位图虽触摸点移动

    package xiaosi.bitmap; import android.app.Activity; import android.os.Bundle; public class mianActiv ...

  8. express中的中间件理解

    什么是中间件 中间件是一个可访问请求对象(req)和响应对象(res)的函数,在 Express 应用的请求-响应循环里,下一个内联的中间件通常用变量 next 表示.中间件的功能包括: 执行任何代码 ...

  9. 洛谷P3383 【模板】线性筛素数(Miller_Rabin)

    题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范围和查询的个数. 接下来M行每行 ...

  10. flask_wtf flask 的 CSRF 源代码初研究

    因为要搞一个基于flask的前后端分离的个人网站,所以需要研究下flask的csrf防护原理. 用的扩展是flask_wtf,也算是比较官方的扩展库了. 先上相关源代码: def validate_c ...