题目链接:https://www.luogu.org/problemnew/show/P1606

这个题。。第一问很好想,但是第二问,如果要跑最短路计数的话,零边权的花怎么办?

不如这样想,如果这个点能到花的话,那把他和从花能到的一个点边权连成一,好比两条路径共为1:一条为1一条为0的路径

但在实际操作的时候,一朵花是可以到另一朵花的!

电风扇好啊

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define int long long
using namespace std;
const int maxn = 2000000;
ll a[50][50], n, m, s, t, ans[maxn], dis[maxn];
bool vis[maxn], used[maxn];
ll dx[9] = {0,-2,-2,-1,+1,+2,+2,+1,-1}, dy[9] = {0,-1,+1,+2,+2,+1,-1,-2,-2};
queue<ll> q;
struct edge{
ll to, next, len;
}e[maxn<<2];
ll head[maxn], cnt;
void add(ll u, ll v, ll w)
{
e[++cnt].len = w; e[cnt].to = v; e[cnt].next = head[u]; head[u] = cnt;
}
void SPFA()
{
for(ll i = 1; i <= n*m; i++) dis[i] = 9223372036854775806;
q.push(s);
vis[s] = 1;
dis[s] = 0;
ans[s] = 1;
while(!q.empty())
{
ll now = q.front(); q.pop();
vis[now] = 0;
for(ll i = head[now]; i != -1; i = e[i].next)
{
ll v = e[i].to;
if(dis[v] > dis[now] + e[i].len)
{
ans[v] = ans[now];
dis[v] = dis[now] + e[i].len;
if(!vis[v])
{
q.push(v);
vis[v] = 1;
}
}
else if(dis[v] == dis[now] + e[i].len) ans[v] += ans[now];
}
}
}
void dfs(ll fx, ll fy, ll tx, ll ty)
{
used[(tx-1)*m+ty] = 1;
for(ll i = 1; i <= 8; i++)
{
ll ex = tx+dx[i], ey = ty+dy[i];
if(ex < 1 || ex > n || ey < 1 || ey > m || used[(ex-1)*m+ey]) continue;
if(a[ex][ey] == 2) continue;
if(a[ex][ey] == 1) dfs(fx, fy, ex, ey);
else used[(ex-1)*m+ey] = 1, add((fx-1)*m+fy, (ex-1)*m+ey, 1);
}
}
void init()
{
memset(head, -1, sizeof(head));
scanf("%lld%lld",&n,&m);
for(ll i = 1; i <= n; i++)
for(ll j = 1; j <= m; j++)
{
scanf("%lld",&a[i][j]);
if(a[i][j] == 3)
s = (i-1)*m+j;
if(a[i][j] == 4)
t = (i-1)*m+j;
}
for(ll i = 1; i <= n; i++)
for(ll j = 1; j <= m; j++)
{
if(a[i][j] == 2 || a[i][j] == 4 || a[i][j] == 1) continue;
memset(used, 0, sizeof(used));
dfs(i, j, i, j);
}
}
#undef ll
int main()
#define ll long long
{
freopen("testdata.in","r",stdin);
init();
SPFA();
if(dis[t] == 9223372036854775806) puts("-1");
else printf("%lld\n%lld",dis[t]-1, ans[t]);
return 0;
}

【luogu P1606 [USACO07FEB]荷叶塘Lilypad Pond】 题解的更多相关文章

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

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

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

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

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

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

  4. 洛谷 P1606 [USACO07FEB]荷叶塘Lilypad Pond【spfa】

    和bzoj同名题不一样! 起点和水点向花费一个荷花能到的第一个点连一条边权为1的有向边,然后跑计数spfa即可 #include<iostream> #include<cstdio& ...

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

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

  6. Dfs+Spfa【p1606】[USACO07FEB]荷叶塘Lilypad Pond

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

  7. LuoguP1606 [USACO07FEB]荷叶塘Lilypad Pond 【最短路】By cellur925

    最短路好题!] 参考资料:学长 https://blog.csdn.net/TSOI_Vergil/article/details/52975779 学长太强了!!!%%% 题目传送门 ======= ...

  8. bzoj1698 / P1606 [USACO07FEB]白银莲花池Lilypad Pond

    P1606 [USACO07FEB]白银莲花池Lilypad Pond 转化为最短路求解 放置莲花的方法如果直接算会有重复情况. 于是我们可以先预处理和已有莲花之间直接互相可达的点,将它们连边(对,忽 ...

  9. BZOJ 1632: [Usaco2007 Feb]Lilypad Pond

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

随机推荐

  1. grpc的数据包监控

    CommView是一个专门为网络管理员,安全专家,网络程序员,以及任何想要全面了解一台个人电脑或一个网段中的网络通信量的用户设计的强大的网络监控器和分析器,不过它支持Win系统. 我这里用的 Comm ...

  2. 阿里云CentOS7.3配置Java Web应用和Tomcat步骤

    阿里云的Linux系统包括CentOS7.3配置了密钥对 怎样将自己ECS实例绑定密钥对,并启用秘钥: https://help.aliyun.com/document_detail/51798.ht ...

  3. 在Ubuntu 14.04.1 LTS 上安装gettext失败

    使用apt-get install -f,因为有额外的依赖.

  4. c# 序列化接口(转载贴)

    http://www.cnblogs.com/TianFang/p/3724449.html

  5. C++ 判断进程是否存在

    原文:http://blog.csdn.net/u010803748/article/details/53927977?locationNum=2&fps=1 一.判断指定程序名的进程是否存在 ...

  6. 六、angular 生成二维码

    首先需要安装angular-qrcode : bower install monospaced/angular-qrcode npm install angular-qrcode 如何使用? 在相应的 ...

  7. 如何查看服务器CPU核心数和线程数

    知道服务器CPU型号,那么我们如何在服务器里面查看服务器CPU核心数和线程数呢? 步骤: 先用鼠标右键点击屏幕最下方的任务栏空白处.会弹出一个菜单. 在菜单中用鼠标左键点选“启动任务管理器”. 点击任 ...

  8. Ubuntu-18.04下安装mysql

    安装mysql服务器 1. sudo apt-get install mysql-server 2. sudo apt-get install mysql-client 登录问题 安装成功后,我们会发 ...

  9. 前端静态资源版本更新与缓存之——通过gulp 在原html文件上自动化添加js、css版本号

    原理 修改js和css文件 通过对js,css文件内容进行hash运算,生成一个文件的唯一hash字符串(如果文件修改则hash号会发生变化) 替换html中的js,css文件名,生成一个带版本号的文 ...

  10. kettle使用命令行传入数据库链接参数(ip、数据库、端口、用户、密码)执行job时子转换失败。

    使用cmd 传参数执行 kettle job 遇到错误: 错误原因,无法找到文件.... 原来使用,通过目录指定转换,好处是:当以文件资源库保存时,可以直接将文件夹复制走,直接运行就可以,不需要单独针 ...