给一个n个点m条边(<=n<=,<=m<=)的无向图,每条边上都涂有一种颜色。求从结点1到结点n的一条路径,使得经过的边数尽量少,在此前提下,经过边的颜色序列的字典序最小。一对结点间可能有多条边,一条边可能连接两个相同结点。输入保证结点1可以达到结点n。颜色为1~^9的整数。

第一次bfs逆向搜索,得到每个点到终点的最短距离,找出最短路;第二次bfs根据最短距离可以选择满足条件的最短路。

 #pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<math.h>
#include<algorithm>
#include<queue>
#include<set>
#include<bitset>
#include<map>
#include<vector>
#include<stdlib.h>
#include <stack>
using namespace std;
int dirx[]={,,-,};
int diry[]={-,,,};
#define PI acos(-1.0)
#define max(a,b) (a) > (b) ? (a) : (b)
#define min(a,b) (a) < (b) ? (a) : (b)
#define ll long long
#define eps 1e-10
#define MOD 1000000007
#define N 100006
#define inf 1e12
int n,m;
vector<int>G[N];
vector<int>C[N];
int dis[N];
int vis[N];
int ans[N];
void bfs1(){//得到每一点到终点的最短距离的模板
queue<int> q;
q.push(n);
dis[n]=;
while(!q.empty()){
int u=q.front();
q.pop(); for(int i=;i<G[u].size();i++){
int v=G[u][i];
if(v==){
dis[v]=dis[u]+;
return;
}
if(dis[v]==-){
dis[v]=dis[u]+;
q.push(v);
}
}
}
}
void bfs2(){
queue<int> q;
q.push();
while(!q.empty()){
int u=q.front();
q.pop();
if(dis[u]==){
return;
}
int minn=-;
for(int i=;i<G[u].size();i++){
int v=G[u][i];
if(dis[v]==dis[u]-){
if(minn==-){
minn=C[u][i];
}
else{
minn=min(minn,C[u][i]);
}
}
} int t=dis[]-dis[u];
if(ans[t]==){
ans[t]=minn;
}
else{
ans[t]=min(ans[t],minn);
} for(int i=;i<G[u].size();i++){
int v=G[u][i]; if(vis[v]== && dis[v]==dis[u]- && C[u][i]==minn){
q.push(v);
vis[v]=;
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)==){
for(int i=;i<N;i++){
G[i].clear();
C[i].clear();
dis[i]=-;
vis[i]=;
ans[i]=;
}
for(int i=;i<m;i++){
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
G[x].push_back(y);
G[y].push_back(x);
C[x].push_back(c);//存 颜 色
C[y].push_back(c);
}
bfs1();//求 出 每 一 点 到 n 的 最 短 距 离
printf("%d\n",dis[]);
bfs2();//从 1开始找最短的路径 ,以及字典序最小
for(int i=;i<dis[];i++){
if(i){
printf(" ");
}
printf("%d",ans[i]);
}
printf("\n");
}
return ;
}

UVA 1599 Ideal Path(bfs1+bfs2,双向bfs)的更多相关文章

  1. UVa 1599 Ideal Path (两次BFS)

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

  2. Uva 1599 Ideal Path - 双向BFS

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

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

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

  4. UVa 1599 Ideal Path【BFS】

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

  5. UVA 1599 Ideal Path

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

  6. UVA 1599 Ideal Path (HDU 3760)

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

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

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

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

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

  9. UVA 1599, POJ 3092 Ideal Path 理想路径 (逆向BFS跑层次图)

    大体思路是从终点反向做一次BFS得到一个层次图,然后从起点开始依次向更小的层跑,跑的时候选则字典序最小的,由于可能有多个满足条件的点,所以要把这层满足条件的点保存起来,在跑下一层.跑完一层就会得到这层 ...

随机推荐

  1. qt model/view 架构基础介绍之QTreeWidget

    # -*- coding: utf-8 -*- # python:2.x #说明:QTreeWidget用于展示树型结构,也就是层次结构同前面说的 QListWidget 类似,这个类需要同另外一个辅 ...

  2. PHP设计模式笔记二:面向对象 -- Rango韩老师 http://www.imooc.com/learn/236

    SPL标准库的使用 SPL是用于解决典型问题(standard problems)的一组接口与类的集合. 1.SPL提供了很多数据结构类,如SplStack.SqlQueue.SqlHeap.SplF ...

  3. 获取对象类型(swift)

    获取对象类型(swift) by 伍雪颖 let date = NSDate() let name = date.dynamicType println(name) let string = &quo ...

  4. thinkphp框架的路径问题 - 总结

    thinkphp框架的路径问题 - 总结 (2011-06-21 11:01:28) 转载▼ 标签: thinkphp 框架 路径 杂谈 分类: Php TP中有不少路径的便捷使用方法,比如模板中使用 ...

  5. EffectiveC#15--使用using和try/finally来做资源清理

    1.任何时候你在使用一个有Dispose()方法的类型时,你就有责任来调用Dispose()方法来释放资源. 最好的方法来保证Dispose()被调用的结构是使用using语句或者try/finall ...

  6. SQL Server无法打开用户默认数据库,登录失败,用户‘sa’登录失败,错误:4064的解决方法

    用windows验证方式进入Management Studio, 安全性 > 用户名 > 右击sa > 属性 > 把默认数据库选“master”

  7. sql server 删除所有表和存储过程

    1.删除外键约束 DECLARE c1 cursor for select 'alter table ['+ object_name(parent_obj) + '] drop constraint ...

  8. Ajax与ashx异步请求的简单案例

    Ajax与ashx异步请求的简单案例: 前台页面(aspx): <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E ...

  9. contentSize、contentInset和contentOffset

    contentSize.contentInset和contentOffset 是 scrollView三个基本的属性. contentSize: The size of the content vie ...

  10. Cortex-M3知识点

    1.不再像别的ARM7那样从thumb状态和ARM状态来回切换 Thumb-2指令集横空出世,Cortex-M3不支持ARM指令集 2.BKP备份寄存器(42个16位寄存器组成),用来存储用户应用程序 ...