逆向+两次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 ...
随机推荐
- 教程-Close、Halt、terminate、ExitProcess的区别
Close:1.只关闭本窗体2.当Close是一个主窗体时,程序会退出.3.Close会发生FormClose事件,FormCloseQuery事件4.主窗体close以后程序就Application ...
- HDU 3661 Assignments (水题,贪心)
题意:n个工人,有n件工作a,n件工作b,每个工人干一件a和一件b,a[i] ,b[i]代表工作时间,如果a[i]+b[j]>t,则老板要额外付钱a[i]+b[j]-t;现在要求老板付钱最少: ...
- UI进阶 数据加密
一.数据安全 在互联网发展趋势迅猛的今天,数据安全的重要性日趋凸显.也成为我们必须了解的互联网知识.在移动互联网浪潮下,用户的资金安全.企业的信息安全都是我们实际开发中必须考虑的内容.
- 浅析网站开发中的 meta 标签的作用
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- android EditText控制光标的位置
利用自定义键盘,需要手动删除编辑框中的文本时,会根据光标的位置来删除字符.那么,如何来控制光标呢,android为我们提供了哪些方法,来处理光标呢? 这里提供几个自己写的方法,根据这些方法可以满足在光 ...
- 用Rufus来制作Windows10的U盘安装盘
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用Rufus来制作Windows10的U盘安装盘.
- c/c++字符串处理大集合
rember this strncpy(a,b,5); a[5]='\0'; char a[10]; memset(a,'#',sizeof(a)); a[10]='\0'; 刚开始学C/C++时,一 ...
- QM课程01-功能概述
QM模块满足一个 CIQ 系统的下列功能: 一般功能 · 在物料主记录中集成QM检验数据 · 管理供应商和客户或销售部门的物料相关的质量信息 · 把质量特性和物料说明中的检验特性连接 · 管理中央凭证 ...
- Codeforces Round #278 (Div. 1) A. Fight the Monster 暴力
A. Fight the Monster Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/487/ ...
- [置顶] How to dump redo log entry?
1.转储针对特定数据块(4号文件的第10-20号数据块)修改的 redo entry select file#,name,blocks from v$datafile; FILE# NAME ...