问题来源

BYVoid魔兽世界模拟赛

【问题描述】

巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气息的生物。孤立于联盟和部落的血色先锋军很快就遭到了天灾军团的重重包围,现在他们将主力只好聚集了起来,以抵抗天灾军团的围剿。可怕的是,他们之中有人感染上了亡灵瘟疫,如果不设法阻止瘟疫的扩散,很快就会遭到灭顶之灾。大领主阿比迪斯已经开始调查瘟疫的源头。原来是血色先锋军的内部出现了叛徒,这个叛徒已经投靠了天灾军团,想要将整个血色先锋军全部转化为天灾军团!无需惊讶,你就是那个叛徒。在你的行踪败露之前,要尽快完成巫妖王交给你的任务。
军团是一个N行M列的矩阵,每个单元是一个血色先锋军的成员。感染瘟疫的人,每过一个小时,就会向四周扩散瘟疫,直到所有人全部感染上瘟疫。你已经掌握了感染源的位置,任务是算出血色先锋军的领主们感染瘟疫的时间,并且将它报告给巫妖王,以便对血色先锋军进行一轮有针对性的围剿。

【输入格式】

第1行:四个整数N,M,A,B,表示军团矩阵有N行M列。有A个感染源,B为血色敢死队中领主的数量。
接下来A行:每行有两个整数x,y,表示感染源在第x行第y列。
接下来B行:每行有两个整数x,y,表示领主的位置在第x行第y列。

【输出格式】

第1至B行:每行一个整数,表示这个领主感染瘟疫的时间,输出顺序与输入顺序一致。
如果某个人的位置在感染源,那么他感染瘟疫的时间为0。

【输入样例】

5 4 2 3
1 1
5 4
3 3
5 3
2 4

【输出样例】

3
1
3

【数据说明】

如下图,标记出了所有人感染瘟疫的时间以及感染源和领主的位置。

  1 2 3 4
1 1 2 3
2 1 2 3
3 2 3 2
4 3 3 2 1
5 3 2

1<=M,N<=500 1<=A,B<=M*N

分析

一道简单的单源最短路模型转换。既然是单源最短路,源点只能有一个,可是题目中有多个感染源,怎么解决呢?我们可以虚拟一个点,这个点与各个源点之间连边,边权为0,这样只需要把这个虚拟点初始时加入队列,就可以求出整张图的最短路了。这就是这个题目中值得着重理解的转化思路。但是我在实际代码中没有虚拟这一个点,而是直接把感染源加入队列,并把他的dist设为0,这样就和前面所说的思路是等价的了。借助这个思路,我在考试时AC了这题,下面是代码:

/*
ID: ringxu97
LANG: C++
TASK: scarlet
SOLUTION: 最短路
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<stack>
#include<queue>
using namespace std; const int inf=0x3f3f3f3f; const int maxn=500+10;
const int maxa=maxn*maxn; const int dx[]={0,0,0,1,-1};
const int dy[]={0,1,-1,0,0}; struct POINT//定义图中节点
{
int x,y;
POINT(int a,int b){x=a;y=b;}
POINT(){x=0;y=0;}
}l[maxa],s[maxa];//l储存leader(领主) s储存Source(感染源)
int N,M,A,B;
int dist[maxn][maxn];//dist[i][j]表示传播到[i][j]所需最短时间
bool inq[maxn][maxn];
queue<POINT>Q; void init()
{
memset(inq,0,sizeof(inq));
for(int i=1;i<=N;++i)
for(int j=1;j<=M;++j)
{
dist[i][j]=inf;
}
} void read()//读入数据
{
scanf("%d%d%d%d",&N,&M,&A,&B);
init();
for(int i=1;i<=A;++i)
{
scanf("%d%d",&s[i].x,&s[i].y);
dist[s[i].x][s[i].y]=0;
POINT tmp(s[i].x,s[i].y);
inq[s[i].x][s[i].y]=1;//初始化源点,并将其加入队列
Q.push(tmp);
}
for(int i=1;i<=B;++i)
{
scanf("%d%d",&l[i].x,&l[i].y);
}
}
inline bool check(int i,int j)//检查是否在图内
{
return (1<=i && i<=N && 1<=j && j<=M);
}
void SPFA()//求最短路
{
while(!Q.empty())
{
POINT u=Q.front();Q.pop();
inq[u.x][u.y]=0;
for(int k=1;k<=4;++k)if(check(u.x+dx[k],u.y+dy[k]))
{
POINT v(u.x+dx[k],u.y+dy[k]);
if(dist[v.x][v.y]>dist[u.x][u.y]+1)
{
dist[v.x][v.y]=dist[u.x][u.y]+1;
if(!inq[v.x][v.y])
{
Q.push(v);
inq[v.x][v.y]=1;
}
}
} }
}
void print()//打印方案
{
for(int i=1;i<=B;++i)
{
printf("%d\n",dist[l[i].x][l[i].y]);
}
} int main()
{
freopen("scarlet.in", "r", stdin);
freopen("scarlet.out", "w", stdout);
read();
SPFA();
print();
return 0;
}

【最短路】血色先锋军(scarlet) 解题报告的更多相关文章

  1. 二模13day1解题报告

    二模13day1解题报告 T1.发射站(station) N个发射站,每个发射站有高度hi,发射信号强度vi,每个发射站的信号只会被左和右第一个比他高的收到.现在求收到信号最强的发射站. 我用了时间复 ...

  2. POJ 3126 Prime Path 解题报告(BFS & 双向BFS)

    题目大意:给定一个4位素数,一个目标4位素数.每次变换一位,保证变换后依然是素数,求变换到目标素数的最小步数. 解题报告:直接用最短路. 枚举1000-10000所有素数,如果素数A交换一位可以得到素 ...

  3. 10.30 NFLS-NOIP模拟赛 解题报告

    总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没 ...

  4. hdu1853解题报告

    题意和解决回路匹配的思路如同hdu3488 (这里我第一次想到最短路,但是对于有回路这个不知道怎么处理,后来看了别人的解题报告才知道KM匹配,但是看到KM之后就自己想...想了很久....还是不知道回 ...

  5. GX/GZOI2019 day2 解题报告

    GX/GZOI2019 day2 解题报告 题目链接 逼死强迫症 旅行者 旧词 t1 逼死强迫症 显然地,记 \(f(i)\) 为长度为 \(i\) 的木板的答案,可得: \(\\\) \[f(i)= ...

  6. 「ZJOI2016」解题报告

    「ZJOI2016」解题报告 我大浙的省选题真是超级神仙--这套已经算是比较可做的了. 「ZJOI2016」旅行者 神仙分治题. 对于一个矩形,每次我们从最长边切开,最短边不会超过 \(\sqrt{n ...

  7. 学大伟业Day1解题报告

    学大伟业Day1解题报告 张炳琪 一.   时间分配 T1:30分钟  T2: 60分钟  T3:100分钟 二.答题情况及错因 T1:100         T2:55             T3 ...

  8. ACM-ICPC 2017 Asia HongKong 解题报告

    ACM-ICPC 2017 Asia HongKong 解题报告 任意门:https://nanti.jisuanke.com/?kw=ACM-ICPC%202017%20Asia%20HongKon ...

  9. 北大ACM试题分类+部分解题报告链接

    转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6642573 部分解题报告添加新内容,除了原有的"大致题意&q ...

随机推荐

  1. iOS LaunchScreen设置启动图片,启动页停留时间

    [新建的iOS 项目启动画面默认为LaunchScreen.xib] 如果想实现一张图片作为启动页,如下图

  2. c++文件读写相关

    在看C++编程思想中,每个练习基本都是使用ofstream,ifstream,fstream,以前粗略知道其用法和含义,在看了几位大牛的博文后,进行整理和总结: 这里主要是讨论fstream的内容: ...

  3. this详解:JAVASCRIPT中的this到底是谁?

    语法 this 全局对象 在全局执行上下文(函数之外),this引用的是全局对象. console.log(this.document === document); // true // In web ...

  4. Canvas实现文字粒子化,并且绕轴旋转(完善)

    1. 之前有放过一个初始版本,但是因为在旋转的时候,有比较大的瑕疵,造成每个点运动到端点后,出现类似撞击的感觉. 2. 所以本文对旋转作了些调整,运用类似水平方向的圆周运动 a. HTML代码,定义c ...

  5. Android单元测试初探——Instrumentation(转载)

    学习Android有一段时间了,虽然前段时间对软件测试有了一些了解,不过接触android的单元测试却是头一次.这几天在物流大赛上也用了不少时间,所以对于android的单元测试没有太深入的研究,所以 ...

  6. MySql数据库3【优化3】缓存设置的优化

    1.表缓存 相关参数: table_open_cache 指定表缓存的大小.每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容.通过检查峰值时间的状 ...

  7. nginx——rewrite模块

    1.什么是Nginx的Rewrite规则? Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用PCRE(Perl Compatible Regular Expressio ...

  8. odoo view field option, action flage 参数

    options JSON object specifying configuration option for the field's widget (including default widget ...

  9. How do I solve the error: An error was encountered while running (Domain = LaunchServicesError, Code = 0) ?

    How do I solve the error: An error was encountered while running (Domain = LaunchServicesError, Code ...

  10. 转:小心,apc可能导致php-fpm罢工!

    原文来自于:http://www.searchtb.com/2014/02/apc-lock-php-fpm.html 最近线上产品出现了502错误.一般出现502错误,都是php-fpm 进程处理请 ...