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

反省:这道题由于有自环和重边的存在,因此满足条件的一个点可能多次被加到队列,这样的复杂度将会成指数级。没注意到这点TLE了几发。。。如果一个点到另一个点的最短路径只有一条,就不用判断重复了。正是因为重边所以特别需要注意这点

示意图:

学习点:

1.层次图的构建,逆向思维。

2.注意不是简单图的情况,重边和自环。

3.搜索最致命的问题就是状态判重

#include<cstdio>
#include<cstring>
#include<vector>
#include<queue> //#define local
using namespace std;
const int INF = 1e9;
const int maxm = 2e5 + ;
const int maxn = 1e5 + ;
int n; struct Edge
{
int v,c,nxt;
}e[maxm<<]; int d[maxn];
int cnt , head[maxn]; //init head -1
inline void addEdge(int u,int v,int c)
{
// e[cnt].u = u;
e[cnt].v = v;
e[cnt].c = c;
e[cnt].nxt = head[u];
head[u] = cnt++;
} void bfs()
{
queue<int> q;
memset(d,-,sizeof(d));
q.push(n); d[n] = ;
int u,v,i;
while(!q.empty()){
u = q.front(); q.pop();
if(u == ) { printf("%d\n",d[u]); return ;}
for(i = head[u]; ~i ; i = e[i].nxt ){
v = e[i].v;
if(~d[v]) continue;
d[v] = d[u] + ;
q.push(v);
}
}
} bool vis[maxn];
void bfs2()
{
queue<int> q;///复杂度写高了 没有给结点判断重复 指数级
int u = ,v, i;
q.push(u);
int c = INF;//最小color
vector<int> vec;//保存下一个层次的点
memset(vis,false,sizeof(vis));
while(!q.empty()||!vec.empty()) { if(q.empty()) { //保证队列里只有一个层次的点,如果队列空了,说明上一层的点都跑完了,这时候c一定是最小的
for(i = ;i < vec.size();i++) {
int k = vec[i], v = e[k].v;
if(e[k].c == c && !vis[v] ) {//vis[v] 重边
if(e[k].v == n) { printf("%d\n",c); return ;}
q.push(e[vec[i]].v); vis[v] = true;
}
}
vec.clear();
printf("%d ",c); c = INF;
} u = q.front(); q.pop(); for(i = head[u]; ~i ; i = e[i].nxt ) {
v = e[i].v;
if(d[u] - d[v] == && e[i].c <= c) {
vec.push_back(i);
c = e[i].c;
}
}
}
} int main()
{
#ifdef local
freopen("in.txt","r",stdin);
#endif // local
int m;
int u,v,c;
while(~scanf("%d%d",&n,&m)){
memset(head,-,sizeof(head)); cnt = ;
while(m--) {
scanf("%d%d%d",&u,&v,&c);
if(u == v) continue;//忽略自环
addEdge(u,v,c);
addEdge(v,u,c);
}
bfs();
bfs2();
}
return ;
}

UVA 1599, POJ 3092 Ideal Path 理想路径 (逆向BFS跑层次图)的更多相关文章

  1. UVa 1599 Ideal Path (两次BFS)

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

  2. POJ 3126 Prime Path 素数筛,bfs

    题目: http://poj.org/problem?id=3126 困得不行了,没想到敲完一遍直接就A了,16ms,debug环节都没进行.人品啊. #include <stdio.h> ...

  3. POJ 3216 Prime Path(打表+bfs)

    Prime Path Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27132   Accepted: 14861 Desc ...

  4. 理想路径——双向BFS

    题目 给n个点m条边(2 ≤ n ≤ 100000,1 ≤ m ≤ 200000)的无向图,每条边上都涂有一种颜色.求从结点1到结点n的一条路径,使得经过的边数尽量的少,在此前提下,经过边的颜色序列的 ...

  5. POJ 3126 Prime Path 解题报告(BFS & 双向BFS)

    题目大意:给定一个4位素数,一个目标4位素数.每次变换一位,保证变换后依然是素数,求变换到目标素数的最小步数. 解题报告:直接用最短路. 枚举1000-10000所有素数,如果素数A交换一位可以得到素 ...

  6. POJ 3126 Prime Path 简单广搜(BFS)

    题意:一个四位数的质数,每次只能变换一个数字,而且变换后的数也要为质数.给出两个四位数的质数,输出第一个数变换为第二个数的最少步骤. 利用广搜就能很快解决问题了.还有一个要注意的地方,千位要大于0.例 ...

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

    题目大意: 对于一个n个房间m条路径的迷宫(Labyrinth)(2<=n<=100000, 1<=m<=200000),每条路径上都涂有颜色,颜色取值范围为1<=c&l ...

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

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

  9. POJ 3126 Prime Path(素数路径)

    POJ 3126 Prime Path(素数路径) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 The minister ...

随机推荐

  1. login.aspx.cs

    using System;                                                                 //指令+系统(命名空间)using Sys ...

  2. C#生成满足特定要求的密码

    代码1 Random m_rnd = new Random(); public char getRandomChar() { ); || (ret > && ret < ) ...

  3. go实现冒泡排序和快速排序

    项目结构 冒泡排序算法,源文件bubblesort.go package bubblesort // 冒泡排序 func BubbleSort(values []int) { for i := 0; ...

  4. Sharepoint2013搜索学习笔记之设置sharepoint网站内容源(五)

    第一步,进入管理中心,点击管理应用程序,点击search service 应用程序进入到搜索管理配置页面,点击内容源 第二步,点击新建内容源,给内容源命名,在爬网内容类型中选sharepoint网站, ...

  5. Android 自定义ViewGroup 实战篇 -> 实现FlowLayout

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38352503 ,本文出自[张鸿洋的博客] 1.概述 上一篇已经基本给大家介绍了如 ...

  6. socket网络编程实践要点

    1.创建udp的socket句柄 // 当host_port为0时,则表示让操作系统自动分配 bool createUdpSocket(string host_ip,unsigned short ho ...

  7. Oracle数据库恢复之resetlogs

    实验环境:RHEL 5.4 + Oracle 11.2.0.3 如果是一名合格的Oracle DBA,对resetlogs这种关键字都应该是极其敏感的,当确认需要这种操作时一定要三思而后行,如果自己不 ...

  8. Automake使用(中级)

    工程地址 automake语言国际化 最初工程目录结构 $ ls -l total 16 drwxrwxr-x. 2 fedora fedora 4096 May 10 10:38 build-aux ...

  9. HDU2874【LCA(模板)】

    第一题LCA,代码参考自:Ice_Crazy 思路: 这个最短路算法是想都别想了,可以看出这幅图就是树嘛,那么对于查询就是求树上两个结点最短距离. 这里就是利用LCA的tarjan离线算法. 算法的大 ...

  10. 汇总:unity中弹道计算和击中移动目标计算方法

    http://download.jikexueyuan.com/detail/id/432.html 弹道计算是游戏里常见的问题,其中关于击中移动目标的自动计算提前量的话题,看似简单,其实还是挺复杂的 ...