逆向+两次bfs(UVA 1599)
为什么都说简单好想咧。坦白从宽看了人家的代码,涨了好多姿势,,
http://blog.csdn.net/u013382399/article/details/38227917
被一个细节坑了。。
2147483647是0x7fffffff啊啊啊,7个f!!!
#include <iostream>
#include <sstream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <set>
#include <cctype>
#include <algorithm>
#include <cmath>
#include <deque>
#include <queue>
#include <map>
#include <stack>
#include <list>
#include <iomanip>
using namespace std; #define INF 0x7fffffff
#define maxn 100000+10 int n, m;
vector<int> g[maxn];//用以存放互相连通的房间
vector<int> col[maxn];//用以存放走廊颜色
int step[maxn];//存放由n到i的最短步数
int ans[maxn*];
int vis[maxn];
void init()
{
for(int i = ; i < maxn; i++)
{
g[i].clear();
col[i].clear();
}
memset(step, -, sizeof(step));
memset(ans, , sizeof(ans));
memset(vis, , sizeof(vis));
}
//==============获得到n的最少步数(逆向由n到1)===========
void bfs1()
{
queue<int> q;
q.push(n);
step[n] = ;//初始,由n到n的最短步数为0
while(!q.empty())
{
int u = q.front(); q.pop();
int sz = g[u].size();
for(int i = ; i < sz; i++)
{
int v = g[u][i]; if(v == )
{
step[v] = step[u]+;
return ;
} if(step[v] == -)
{
step[v] = step[u]+;
q.push(v);
}
}
}
return ;
} //==========获得最少步数时的最小走廊颜色===========
void bfs2()
{
queue<int> q;
q.push();
while(!q.empty())
{
int u = q.front(); q.pop();
///
if(!step[u]) return ;//到达n
///
int mmin = INF;
int sz = g[u].size();
for(int i = ; i < sz; i++)
{
int v = g[u][i];
if(step[v] == step[u]-)
{
mmin = min(mmin, col[u][i]);//注意理解c[u][i]与g[u][i]间的联系--c[u][i]是u连接g[u][i]的走廊颜色
}
}
//==========以上获得了从1出发最短路中每步的最小色 int tmp_step = step[] - step[u];//从1到u的步数,即出发第tmp_step步
//ans[tmp_step] = (ans[tmp_step] == 0 ? mmin : min(mmin, ans[tmp_step]));
if(ans[tmp_step] == ) ans[tmp_step] = mmin;
else ans[tmp_step] = min(ans[tmp_step], mmin); for(int i = ; i < sz; i++)
{
int v = g[u][i];
///该处判断条件很重要,把走过的路做标记
if(!vis[v] && step[v] == step[u]- && mmin == col[u][i])
{
vis[v] = ;
q.push(v);
}
}
}
return ;
}
int main()
{
//===================input=====================
while(~scanf("%d%d", &n, &m))
{
init();
while(m--)
{
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if(a == b) continue;
g[a].push_back(b);
g[b].push_back(a);
col[a].push_back(c);
col[b].push_back(c);
}
//===============逆向bfs===============
//============获得最短步数=============
bfs1();
//===============正向bfs===============
//==========获得每步的走廊颜色=========
bfs2(); printf("%d\n", step[]);
for(int i = ; i < step[]; i++)
{
if(i) printf(" ");
printf("%d", ans[i]);
}
printf("\n");
}
return ;
}
逆向+两次bfs(UVA 1599)的更多相关文章
- UVa 1599 Ideal Path (两次BFS)
题意:给出n个点,m条边的无向图,每条边有一种颜色,求从结点1到结点n颜色字典序最小的最短路径. 析:首先这是一个最短路径问题,应该是BFS,因为要保证是路径最短,还要考虑字典序,感觉挺麻烦的,并不好 ...
- UVa 11624,两次BFS
题目链接:http://vjudge.net/contest/132239#problem/A 题目链接:https://uva.onlinejudge.org/external/116/11624. ...
- UVA 11624 Fire!(两次BFS+记录最小着火时间)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVa 1599 理想路径(反向BFS 求最短路径 )
题意: 给定一个有重边有自环的无向图,n个点(2 <= n <= 100000), m条边(1 <= m <= 200000), 每条边有一个权值, 求从第一个点到n的最少步数 ...
- Fire! UVA - 11624 (两步bfs)
题目链接 题意 人要从迷宫走出去,火会向四个方向同时扩散 分析 两步bfs,先出火到达各地时的时间(设初始时间为0,人每走一步为1s,在着一步内火可以向四周可触及的方向同时扩散),然后在bfs人,人能 ...
- UVA 1599 Ideal Path (HDU 3760)
两次bfs: 第一次bfs逆向搜索,得到每个点到终点的最短距离,找出最短路:第二次bfs根据最短距离可以选择满足条件的最短路. 注意!碰到这种很大数据量的题目一定要记得用scanf,printf 输入 ...
- POJ 1475 Pushing Boxes 搜索- 两重BFS
题目地址: http://poj.org/problem?id=1475 两重BFS就行了,第一重是搜索箱子,第二重搜索人能不能到达推箱子的地方. AC代码: #include <iostrea ...
- HDU2612---(两次BFS)
Description Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Nin ...
- CSU - 2031 Barareh on Fire (两层bfs)
传送门: http://acm.csu.edu.cn/csuoj/problemset/problem?pid=2031 Description The Barareh village is on f ...
随机推荐
- Spring+Quartz 整合二:调度管理与定时任务分离
新的应用场景:很多时候,我们常常会遇到需要动态的添加或修改任务,而spring中所提供的定时任务组件却只能够通过修改xml中trigger的配置才能控制定时任务的时间以及任务的启用或停止,这在带给我们 ...
- Java设计模式系列之命令模式
命令模式(Command)的定义 将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化:对请求排队或记录日志,以及支持可撤销的操作,将”发出请求的对象”和”接收与执行这些请求的对象”分隔开来. ...
- App Extension编程指南(iOS8/OS X v10.10)中文版
http://www.cocoachina.com/ios/20141023/10027.html 当iOS 8.0和OS X v10.10发布后,一个全新的概念出现在我们眼前,那就是应用扩展.顾名思 ...
- ocp 1Z0-042 1-60题解析
1. Because of a power outage,instance failure has occurred. From what point in the redo log does rec ...
- 简单的圆形图标鼠标hover效果 | CSS3教程
演示 本教程将和大将分享一些简单的圆形图标在鼠标hover时的动画效果.这种效果在不少时尚的酷站上都有.本教程中的例子主要是利用在a元素的伪元素上使用CSS transitions和animation ...
- ASP.NET面试题总结
1.ASP.NET中的身份验证有那些?你当前项目采用什么方式验证请解释ASP.NET身份验证模式包括Windows.Forms(窗体).Passport(护照)和None(无). 1.Windows身 ...
- jeecms支持的freemaker标签大全
<@e.form id="jvForm" action="o_add.do"> <@e.text label="字段名" ...
- 多线程和Boost::Asio
线程安全 一般的,高并发使用不同的对象是安全的,在高并发中使用单一的对象是不安全的,io_service类型提供了单对象高并发的强安全保证. 线程池 多线程可能调用io_service::run()来 ...
- 2015南阳CCPC E - Ba Gua Zhen 高斯消元 xor最大
Ba Gua Zhen Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 无 Description During the Three-Kingdom perio ...
- URAL 1784 K - Rounders 找规律
K - RoundersTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view. ...