P1606 [USACO07FEB]白银莲花池Lilypad Pond

转化为最短路求解

放置莲花的方法如果直接算会有重复情况。

于是我们可以先预处理和已有莲花之间直接互相可达的点,将它们连边(对,忽略它们)。

于是剩下的就是边权为1的边了。

酱紫我们就成功转化为了边权问题。

蓝后跑跑最短路顺便计个数就解决了。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<queue>
  5. using namespace std;
  6. #define N 50
  7. #define inf 2e9
  8. typedef long long ll;
  9. struct data{
  10. int d,u;
  11. data(){}
  12. data(int A,int B):
  13. d(A),u(B){}
  14. bool operator < (const data &tmp) const{
  15. return d>tmp.d;
  16. }
  17. };priority_queue <data> h;
  18. const int d1[]={,,-,-,,-,,-};
  19. const int d2[]={-,,-,,,,-,-};
  20. int n,m,S,T,id[N][N],e[N][N],d[N*N];
  21. int cnt,hd[N*N],nxt[],ed[N*N],poi[];
  22. bool vis[N][N]; ll t[N*N];
  23. void adde(int x,int y){
  24. nxt[ed[x]]=++cnt; hd[x]=hd[x]?hd[x]:cnt;
  25. ed[x]=cnt; poi[cnt]=y;
  26. }
  27. void draw(int tt,int x,int y){
  28. vis[x][y]=;
  29. for(int i=,r1,r2;i<;++i){
  30. r1=x+d1[i],r2=y+d2[i];
  31. if(r1<||r1>n||r2<||r2>m||vis[r1][r2]) continue;
  32. if(e[r1][r2]==) draw(tt,r1,r2);
  33. else vis[r1][r2]=,adde(tt,id[r1][r2]);
  34. }
  35. }
  36. int main(){
  37. scanf("%d%d",&n,&m);
  38. for(int i=,r=;i<=n;++i)
  39. for(int j=;j<=m;++j){
  40. scanf("%d",&e[i][j]);
  41. id[i][j]=++r; d[r]=inf;
  42. if(e[i][j]==) S=r;
  43. if(e[i][j]==) T=r;
  44. }
  45. for(int i=;i<=n;++i)
  46. for(int j=;j<=m;++j)
  47. if(e[i][j]==||e[i][j]==){
  48. memset(vis,,sizeof(vis));
  49. draw(id[i][j],i,j);//没有莲花:就和其他所有与该点之间只要加一朵莲花就可达的点,连一条边权1的边。
  50. }
  51. h.push(data(d[S]=,S)); t[S]=;
  52. while(!h.empty()){
  53. data x=h.top(); h.pop();
  54. if(x.d!=d[x.u]) continue;
  55. for(int i=hd[x.u];i;i=nxt[i]){
  56. int to=poi[i];
  57. if(d[to]==d[x.u]+){
  58. t[to]+=t[x.u];
  59. }else if(d[to]>d[x.u]+){
  60. d[to]=d[x.u]+;
  61. t[to]=t[x.u];
  62. h.push(data(d[to],to));
  63. }
  64. }
  65. }
  66. if(d[T]==inf) printf("-1");
  67. else printf("%d\n%lld",d[T]-,t[T]);//减去终点多算的一朵
  68. return ;
  69. }

bzoj1698 / P1606 [USACO07FEB]白银莲花池Lilypad Pond的更多相关文章

  1. P1606 [USACO07FEB]白银莲花池Lilypad Pond

    这个题其实算是个最短路计数,建图的直观思想很简单,但是很显然有一个地方没法处理,就是有的时候通过两条路走到同一个地方的话方案数会计算两次.我们发现加上原有的莲花就很难处理,会计算重复.我们要想办法避免 ...

  2. Luogu 1606 [USACO07FEB]白银莲花池Lilypad Pond

    感觉应当挺简单的,但是弄了好久……菜死了 如果不考虑那些为$1$的点,直接跑个最短路计数就好了,但是我们现在有一些边可以不用付出代价,那么只要在连边的时候先预处理搜一下就好了. 原来的想法是拆点,但是 ...

  3. 最短路【洛谷P1606】 [USACO07FEB]荷叶塘Lilypad Pond

    P1606 [USACO07FEB]荷叶塘Lilypad Pond 为了让奶牛们娱乐和锻炼,农夫约翰建造了一个美丽的池塘.这个长方形的池子被分成了M行N列个方格(1≤M,N≤30).一些格子是坚固得令 ...

  4. 洛谷 P1606 [USACO07FEB]荷叶塘Lilypad Pond 解题报告

    P1606 [USACO07FEB]荷叶塘Lilypad Pond 题目描述 FJ has installed a beautiful pond for his cows' aesthetic enj ...

  5. P1606 [USACO07FEB]荷叶塘Lilypad Pond(最短路计数)

    P1606 [USACO07FEB]荷叶塘Lilypad Pond 题目描述 FJ has installed a beautiful pond for his cows' aesthetic enj ...

  6. BZOJ 1632: [Usaco2007 Feb]Lilypad Pond

    题目 1632: [Usaco2007 Feb]Lilypad Pond Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 390  Solved: 109[ ...

  7. 1632: [Usaco2007 Feb]Lilypad Pond

    1632: [Usaco2007 Feb]Lilypad Pond Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 404  Solved: 118[Sub ...

  8. 【luogu P1606 [USACO07FEB]荷叶塘Lilypad Pond】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1606 这个题..第一问很好想,但是第二问,如果要跑最短路计数的话,零边权的花怎么办? 不如这样想,如果这个点 ...

  9. [洛谷P1606] [USACO07FEB] 荷叶塘Lilypad Pond

    Description 为了让奶牛们娱乐和锻炼,农夫约翰建造了一个美丽的池塘.这个长方形的池子被分成了M行N列个方格(1≤M,N≤30).一些格子是坚固得令人惊讶的莲花,还有一些格子是岩石,其余的只是 ...

随机推荐

  1. Centos7 安装hive

    安装hive 配置hive 在hdfs中新建目录/user/hive/warehouse 首先启动hadoop任务 hdfs dfs -mkdir /tmp hdfs dfs -mkdir /user ...

  2. ubuntu16.04下安装wps

    首先下载安装 下载 wps for linux 在终端用命令安装 sudo dpkg -i wps-office_10.~a21_amd64.deb 字体缺失问题 下载 wps_symbol_font ...

  3. POJ 1849 - Two - [DFS][树形DP]

    Time Limit: 1000MS Memory Limit: 30000K Description The city consists of intersections and streets t ...

  4. SQL Fundamentals || Single-Row Functions || 日期函数date functions

    SQL Fundamentals || Oracle SQL语言   SQL Fundamentals: Using Single-Row Functions to Customize Output使 ...

  5. CCCC L2-007. 家庭房产 建图 XJB模拟

    https://www.patest.cn/contests/gplt/L2-007 题解:一开始是想直接并查集,一个家就是一个集合,对每个集合维护一个人数num1一个房产数num2 一个房产面积ar ...

  6. 安装中文输入法 ubuntu shortcut desktop

    安装中文输入法 Kali自带是不能输入中文的,因此我安装了搜狗输入法和谷歌输入法(我做备份的),安装其一便可以.建议安装前apt-get update下,刷新下.其次安装好任意输入法需要重启下才能正常 ...

  7. centos7 kdump.service启动失败的解决方法

    最近接触学习使用CentOs7,命令上的确有很大变化. 加入到开机启动,可以使用下面命令来加到开机启动列表, systemctl enable xxx.service 通过下面命令可以查看有哪些是开机 ...

  8. swap file "*.swp" already exists!

    ll -a rm .*.swp

  9. 【F12】九个Console命令,让js调试更简单

    一.显示信息的命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <!DOCTYPE html> <html> <head>     &l ...

  10. 【Python】【Web.py】python调用html【问题:echart图标调用html上未显示】

    code调用123.html和echarts.min.js文件 code.py import web import execjs urls = ( '/hello', 'hello', ) app = ...