博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CodeForces1214D
阅读量:5288 次
发布时间:2019-06-14

本文共 2596 字,大约阅读时间需要 8 分钟。

这个题据我所知有两种比较优秀的做法.
第一种是\(DP\)统计每个点的路径数,然后找出必经点,再从必经点开始\(bfs\)堵路.
第二种比较简单,你先\(bfs\)一遍,如果不连通,直接输出\(0\),否则,找到任意一条路径(可以发现,一定是最短路)堵死.
然后重复这个过程,进行了几次\(bfs\)就需要至少几个障碍来堵路.
这其实有点类似于网络流最大流算法\(Dinic\)中的每次走一条阻塞流.
正确性,从终点的两个来路考虑即可.
\(Code:\)

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MEM(x,y) memset ( x , y , sizeof ( x ) )#define rep(i,a,b) for (int i = a ; i <= b ; ++ i)#define per(i,a,b) for (int i = a ; i >= b ; -- i)#define pii pair < int , int >#define X first#define Y second#define rint read
#define int long long#define pb push_backusing std::set ;using std::pair ;using std::max ;using std::min ;using std::priority_queue ;using std::vector ;using std::swap ;using std::sort ;using std::unique ;using std::greater ;template < class T > inline T read () { T x = 0 , f = 1 ; char ch = getchar () ; while ( ch < '0' || ch > '9' ) { if ( ch == '-' ) f = - 1 ; ch = getchar () ; } while ( ch >= '0' && ch <= '9' ) { x = ( x << 3 ) + ( x << 1 ) + ( ch - 48 ) ; ch = getchar () ; } return f * x ;}template < class T > inline void write (T x) { static T stk[100] , top = 0 ; if ( x == 0 ) { putchar ('0') ; return ; } if ( x < 0 ) { x = - x ; putchar ( '-' ) ; } while ( x ) { stk[++top] = x % 10 ; x /= 10 ; } while ( top ) { putchar ( stk[top--] + '0' ) ; } putchar ('\n') ; }const int N = 1e6 + 100 ;std::queue < pii > q ;char e[N] ;int n , m , pre[N] ;bool fbd[N] , mk[N] ;int fx[] = { 0 , 1 } ;int fy[] = { 1 , 0 } ;inline void bfs () { q.push ( { 1 , 1 } ) ; mk[1] = true ; while ( ! q.empty () ) { int dx = q.front ().X , dy = q.front().Y ; q.pop () ; rep ( i , 0 , 1 ) { int tx = dx + fx[i] , ty = dy + fy[i] ; int cur = m * ( tx - 1 ) + ty ; if ( tx < 1 || ty < 1 || tx > n || ty > m || fbd[cur] || mk[cur] || e[cur] == '#' ) continue ; mk[cur] = true ; pre[cur] = m * ( dx - 1 ) + dy ; q.push ( { tx , ty } ) ; } } return ;}signed main (int argc , char * argv[] ) { n = rint () ; m = rint () ; rep ( i , 1 , n ) scanf ("%s" , e + m * ( i - 1 ) + 1 ) ; bfs () ; if ( ! mk[m*(n-1)+m] ) { puts ("0") ; return 0 ; } MEM ( mk , 0 ) ; for (int i = m*(n-1)+m ; i ; i = pre[i] ) if ( i != 1 && i != m*(n-1)+m ) fbd[i] = true ; bfs () ; if ( ! mk[m*(n-1)+m] ) { puts ("1") ; return 0 ; } MEM ( mk , 0 ) ; for (int i = m*(n-1)+m ; i ; i = pre[i] ) if ( i != 1 && i != m*(n-1)+m ) fbd[i] = true ; bfs () ; if ( ! mk[m*(n-1)+m] ) { puts ("2") ; return 0 ; } return 0 ;}

转载于:https://www.cnblogs.com/Equinox-Flower/p/11469137.html

你可能感兴趣的文章
springboot helloworld
查看>>
 P2152 [SDOI2009]SuperGCD (luogu)
查看>>
翻翻git之---效果鲜明的类ViewPager库 ConvenientBanner(对图片载入部分进行改动)...
查看>>
【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理
查看>>
springboot项目中配置swagger-ui
查看>>
forward和redirect的区别详解
查看>>
inno setup介绍及官方网站地址
查看>>
一个简单的拼写检查器
查看>>
win10更换登陆背景和关闭锁屏
查看>>
20175126《Java程序设计》第七周学习总结
查看>>
导出文件名乱码解决方案
查看>>
Leetcode Convert Sorted Array to Binary Search Tree
查看>>
CentOS6和CentOS7安装jumpserver
查看>>
hdu 1276士兵队列问题【queue】
查看>>
nandflash裸机程序分析
查看>>
Bzoj 2038: [2009国家集训队]小Z的袜子(hose)
查看>>
图片字节流生成bmp文件
查看>>
常用函数、文本处理函数、日期函数
查看>>
.net core下获取自身服务器地址
查看>>
Solr 07 - Solr从MySQL数据库中导入数据 (Solr DIH的使用示例)
查看>>