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[8]={2,2,-2,-2,1,-1,1,-1};
19 const int d2[8]={-1,1,-1,1,2,2,-2,-2};
20 int n,m,S,T,id[N][N],e[N][N],d[N*N];
21 int cnt,hd[N*N],nxt[100009],ed[N*N],poi[100000];
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]=1;
29     for(int i=0,r1,r2;i<8;++i){
30         r1=x+d1[i],r2=y+d2[i];
31         if(r1<1||r1>n||r2<1||r2>m||vis[r1][r2]) continue;
32         if(e[r1][r2]==1) draw(tt,r1,r2);
33         else vis[r1][r2]=1,adde(tt,id[r1][r2]);
34     }
35 }
36 int main(){
37     scanf("%d%d",&n,&m);
38     for(int i=1,r=0;i<=n;++i)
39         for(int j=1;j<=m;++j){
40             scanf("%d",&e[i][j]);
41             id[i][j]=++r; d[r]=inf;
42             if(e[i][j]==3) S=r;
43             if(e[i][j]==4) T=r;
44         }
45     for(int i=1;i<=n;++i)
46         for(int j=1;j<=m;++j)
47             if(e[i][j]==0||e[i][j]==3){
48                 memset(vis,0,sizeof(vis));
49                 draw(id[i][j],i,j);//没有莲花:就和其他所有与该点之间只要加一朵莲花就可达的点,连一条边权1的边。
50             }
51     h.push(data(d[S]=0,S)); t[S]=1;
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]+1){
58                 t[to]+=t[x.u];
59             }else if(d[to]>d[x.u]+1){
60                 d[to]=d[x.u]+1;
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]-1,t[T]);//减去终点多算的一朵
68     return 0;
69 }

View Code

转载于:https://www.cnblogs.com/kafuuchino/p/10058009.html

bzoj1698 / P1606 [USACO07FEB]白银莲花池Lilypad Pond相关推荐

  1. 【USACO】青铜莲花池[2]

    前言 搜索到这篇文章的朋友,那么很巧了,我们多半是一个学校的,为什么呢?因为这道题叫白银莲花池.. 题目 [问题描述] FJ建造了一个美丽的池塘,用于让奶牛们锻炼.这个长方形的池子被分割成了 M 行和 ...

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

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

  3. bzoj 1632: [Usaco2007 Feb]Lilypad Pond(BFS)

    1632: [Usaco2007 Feb]Lilypad Pond Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 688  Solved: 230 [S ...

  4. bzoj 1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘(BFS)

    1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 550  Solved: 1 ...

  5. Problem : [usaco2007 Feb]Lilypad Pond

    Problem : [usaco2007 Feb]Lilypad Pond Description Farmer John 建造了一个美丽的池塘,用于让他的牛们审美和锻炼. 这个长方形的池子被分割成了 ...

  6. 故事公园-—昆明莲花池

    每个公园都有自己的地理特征,奇风异俗,各存其韵.昆明莲花池公园则因几处遗址以及涉及的故事,让人们留连往返,奕奕不舍,他(她)们的故事让世人感叹! 这里的遗址其中有南明末代皇帝的墓地,陈圆圆的梳妆楼,现 ...

  7. 洛谷 P1606 [USACO07FEB]荷叶塘Lilypad Pond(spfa+最短路计数) 题解

    题目来源: https://www.luogu.org/problemnew/show/P1606 题目描述: 题目描述 FJ has installed a beautiful pond for h ...

  8. [USACO07FEB] Lilypad Pond

    https://www.luogu.org/problem/show?pid=1606 题目描述 FJ has installed a beautiful pond for his cows' aes ...

  9. 洛谷P1606 Lilypad Pond G

    传送门 题目描述 FJ has installed a beautiful pond for his cows' aesthetic enjoyment and exercise. The recta ...

  10. [USACO07FEB]Lilypad Pond

    Link 考场上把我送走的一道题 考试时,晃眼一看,这不是裸的最短路计数吗?!赶忙写好了代码,自信地关闭了文件.然后,0分-- 那么回过头来,到底错在哪里?只有新加的荷叶才会被统计,而原来就有的荷叶不 ...

最新文章

  1. linux7提示软件安装源位置不对,详解 RHEL7.1 yum源配置与软件安装
  2. 详解Scala与Java的互动
  3. BeetleX.FastHttpApi之JWT和自定义访问验证
  4. Jsp+Ssh+Mysql实现的简单的企业物资信息管理系统
  5. 耳挂式蓝牙耳机原理_一种耳挂式蓝牙耳机的制作方法
  6. cgcs2000大地坐标系地图_CGCS2000坐标系和WGS84坐标系的区别联系
  7. 计算机显示去掉拼音分类,win10系统取消电脑文件显示以字母数字拼音分组的解决方法...
  8. FFmpeg —— 为视频添加文字水印(完美解决中文乱码,无需编译)
  9. 优锘科技:森数据初体验
  10. XXL任务调度平台+java实现定时任务
  11. STACEY矩阵-0114
  12. KMP --算法竞赛(33)
  13. MySQL-存储表情字符
  14. python用matplotlib作图时,x轴为时间轴,如何让x轴每隔几个点显示一次?
  15. 国产加速度传感器QMA6100P
  16. wdcp-apache配置错误导致进程淤积进而内存吃紧
  17. 【LeetCode】【队列】剑指 Offer 59 - I. 滑动窗口的最大值 思路解析和代码
  18. Replication(上):常见复制模型分布式系统挑战
  19. 【求整数 1-100 的累加值,但要求跳过所有个位数为3的数 】
  20. 对replaceA11(., /)的理解

热门文章

  1. 如何将文字转换为二维码 python_用python将二维码转换成字符直接输出控制台
  2. ANDROID_MARS学习笔记_S04_004_用HTTPCLENT发带参数的get和post请求
  3. kubernetes配置kubeconfig访问集群
  4. 百度apollo自动驾驶planning代码学习-Apollo\modules\planning\constraint_checker\CollisionChecker类代码详解
  5. 【无标题】对于_, predicted = torch.max(outputs.data, 1)的理解
  6. c语言方程没有解,【C语言】一元二次方程的解
  7. 计算机桌面有边框阴影,“桌面图标下面有阴影的解决方案”的解决方案
  8. java 截取图片后缀
  9. 使用Java实现身份证真假校验
  10. MATLAB 使用GUI设计简单的计算器