题意:给定一个图,图中的#代表一个塔,图的右下角有一条蛇怪,向左边发射一条光线,光线经过被magic的塔能向四个方向发射,问经过最少多少次magic可以使每个从左上角进入的人都被石化。
思路:一开始思路很简单,直接用最简单的最短路,每次在四个方向上找到塔。然后push进队列,最后只要找到横坐标为1的塔即跳出。实现很简单,但是直接超时了,然后学长提供了一种很神的方法。
如果(x,y)是一个塔,那么代表节点i到j+n有一条路,j+n到i有一条路,然后问题就简化成找到节点1-n的最短路。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <map>
#include <iomanip>
#define PI acos(-1.0)
#define Max 1000005
#define inf 1<<28
#define LL(x) (x<<1)
#define RR(x)(x<<1|1)
using namespace std;
vector<int>g[Max];
int n,m;
int visit[Max];
int num[Max];
queue<int >q;
void bfs()
{
int i,j;
visit[n]=1;
n