SUSTOJ_路痴的单身小涵(图中最短路的条数)
去年因为太low没有做出来校赛的最后一题,遂今年校赛做了这个题,下面我做详细描述。
本题大意:给定一个无向图G,每个边的权值为1,图中L表示起点,C表示终点,#表示未通路,给定时间k,让你判断是否能在给定时间k内走到C,并回答路径最短的路径有多少条?
本题思路:裸的搜索问题,由于图过大,所以直接dfs搜会超时,需要先bfs求解答案如果k步内能走到则再进行下一步的求解。。。
参考代码:
- #include <cstdio>
- #include <iostream>
- #include <cstring>
- #include <string>
- #include <queue>
- #include <stack>
- #include <set>
- #include <map>
- #include <cmath>
- #include <algorithm>
- #define mid ((l + r) / 2)
- using namespace std;
- typedef pair<int, int> pii;
- typedef long long ll;
- typedef unsigned long long ull;
- const double pi = acos(-1.0);
- const int maxn = 1e3 + ;
- int n, m, k, step, ans, Dist;
- char G[maxn][maxn];
- int dist[maxn][maxn];
- bool vis[maxn][maxn];
- pii B, E, now, Next;
- int bfs(int x, int y) {
- memset(vis, false, sizeof vis);
- memset(dist, , sizeof dist);
- queue <pii> Q;
- Q.push(make_pair(x, y));
- dist[x][y] = ;
- while(!Q.empty()) {
- pii now = Q.front();
- Q.pop();
- if(now.first == E.first && now.second == E.second) return dist[now.first][now.second];
- for(int dx = -; dx <= ; dx ++) {
- for(int dy = -; dy <= ; dy ++) {
- if(abs(dx - dy) == ) {
- Next.first = now.first + dx;
- Next.second = now.second + dy;
- if(!vis[Next.first][Next.second] && Next.first >= && Next.first < n && Next.second >= && Next.second < m && G[Next.first][Next.second] != '#') {
- dist[Next.first][Next.second] = dist[now.first][now.second] + ;
- Q.push(make_pair(Next.first, Next.second));
- vis[Next.first][Next.second] = true;
- }
- }
- }
- }
- }
- return -;
- }
- void dfs(pii B, pii E, int D) {
- if(B.first == E.first && B.second == E.second) {
- if(D < Dist) {
- step = ;
- Dist = D;
- } else if(D == Dist) step ++;
- return;
- }
- if(D > Dist) return;
- for(int i = -; i <= ; i ++) {
- for(int j = -; j <= ; j ++) {
- if(abs(i - j) == ) {
- if(B.first + i >= && B.first + i < n && B.second + j >= && B.second + j < m) {
- if(G[B.first + i][B.second + j] != '#' && !vis[B.first + i][B.second + j]) {
- vis[B.first + i][B.second + j] = true;
- dfs(make_pair(B.first + i, B.second + j), E, D + );
- vis[B.first + i][B.second + j] = false;
- }
- }
- }
- }
- }
- }
- int main() {
- ios_base :: sync_with_stdio(false);
- int t, Case = ;
- cin >> t;
- while(t --) {
- step = ;
- Dist = 0x3f3f3f3f;
- cin >> n >> m >> k;
- for(int i = ; i < n; i ++) cin >> G[i];
- for(int i = ; i < n; i ++) {
- for(int j = ; j < m; j ++) {
- if(G[i][j] == 'L') B = make_pair(i, j);
- if(G[i][j] == 'C') E = make_pair(i, j);
- }
- }
- ans = bfs(B.first, B.second);
- if(ans > k) ans = -;
- cout << "Case #" << ++ Case << ": " << ans << ' ';
- if(ans != -) {
- memset(vis, false, sizeof vis);
- dfs(B, E, );
- cout << step;
- }
- cout << endl;
- }
- return ;
- }
相同的题目,如果边的权值不为1,则可用SPFA+dfs求解。
SUSTOJ_路痴的单身小涵(图中最短路的条数)的更多相关文章
- dijskra算法(求正权图中最短路)
思想:每次找到离原点最近的顶点,以这个点为中心扩展松弛,更新其余点到原点的最短路径. 注意:if(e[u][v]>x)e[u][v]=x; book[ ]数组标记最短路程的顶点集合 #inclu ...
- poj 2135 Farm Tour 最小费用最大流建图跑最短路
题目链接 题意:无向图有N(N <= 1000)个节点,M(M <= 10000)条边:从节点1走到节点N再从N走回来,图中不能走同一条边,且图中可能出现重边,问最短距离之和为多少? 思路 ...
- [hdu2460]network(依次连边并询问图中割边数量) tarjan边双联通分量+lca
题意: 给定一个n个点m条边的无向图,q个操作,每个操作给(x,y)连边并询问此时图中的割边有多少条.(连上的边会一直存在) n<=1e5,m<=2*10^5,q<=1e3,多组数据 ...
- Scala进阶之路-Spark底层通信小案例
Scala进阶之路-Spark底层通信小案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Spark Master和worker通信过程简介 1>.Worker会向ma ...
- opencv删除二值图中较小的噪点色块
CvSeq* contour = NULL; double minarea = 100.0; double tmparea = 0.0; CFileDialog dlg(true); if (dlg. ...
- 有趣 GIF 动图集 - 仿佛每张小动图都诉说了一个小笑话或者小故事
点这里 来自法国南特(Nantes)的 Guillaume Kurkdjian 目前还是个学生.Kurkdjian 擅长创作一些平面动态图像,这些有趣的小动图仿佛每张都诉说了一个小笑话或者小故事,像个 ...
- WPF 小矢量图 : 主页,返回,加,减,文字按钮,左移,右移
原文:WPF 小矢量图 : 主页,返回,加,减,文字按钮,左移,右移 代码:: <UserControl x:Class="SQ.TestPage" xmlns=" ...
- 图中最短路径算法(Dijkstra算法)(转)
1.Dijkstra 1) 适用条件&范围: a) 单源最短路径(从源点s到其它所有顶点v); b) 有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E ...
- 最简单实用的JQuery实现banner图中的text打字动画效果!!!
下面,就让小博详细介绍如何实现上面GIF实现的banner图中的文字动画效果,最简单实用的方法(鉴于代码量较小,就内嵌在一个HTML文件中了): 首先,我们要在header导入一个jQuery,并新建 ...
随机推荐
- java调用shell脚本小demo
复制指定文件cpp.sh: [root@localhost soft]# vim cpp.sh#!/bin/bash name="$1"\cp /home/soft/test/${ ...
- java 中的编码(二)
UTF-16编码规则: 按照UTF-16编码规则计算下Unicode码位为 U+10002 (十进制:65538)的字符的UTF-16编码表示. U+10002落在 [U+10000, U+10FFF ...
- 控制DIV内容滚动的方法,实现不用拖滚动条就可以看到最新消息
三种控制DIV内容滚动的方法: 本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群: 281442983 (点击链接加入群:http://jq.qq.com/?_wv ...
- hive group by distinct区别以及性能比较
Hive去重统计 相信使用Hive的人平时会经常用到去重统计之类的吧,但是好像平时很少关注这个去重的性能问题,但是当一个表的数据量非常大的时候,会发现一个简单的count(distinct order ...
- mybatis config 快速生成xml DAO
0.加jar包 1.a.BAT java -jar E:\GZH\Mybaits\mybatis-generator-core-1.3.2\lib\mybatis-generator-core-1.3 ...
- docker 内时区和宿主机差8个小时,怎么办?
docker run -d -it --name tt -e TZ=Asia/Shanghai -p : api 使用-e参数指定时区
- POJ 2456 Aggressive cows ( 二分 && 贪心 )
题意 : 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 <= xi <= 1e9) ...
- 设计模式学习笔记——Adapter 适配器模式
适配器设计模式的适应场景: 一般情况是上端固定,下端固定,下端功能不满足或跟上端不协调,使用适配器重新包一层(继承适配器接口,以满足上端需求,继承下层类,以调用方法),使下端代码能满足上端需求(欺骗, ...
- UOJ418. 【集训队作业2018】三角形
http://uoj.ac/problem/418 题解 考虑激活每个节点时,它的每个儿子都是放满的. 那每一次的操作我们可以用一个二元组来表示\((w_i-\sum w_{son},\sum w_{ ...
- android开源框架thinkinandroid相关研究
和命令相关的类有: TAICommand:接口文件,一个命令接口所有命令需要从此实现,还有以下几种方法: TACommandExecutor 命令的实现类,其中含有commands这个成员变量.大部分 ...