从第一行每一个点开始bfs,这样可以知道每一个点可以覆盖在最后一行的区间。判一下不能覆盖的情况。然后可以完全覆盖的话,那么最优解中第一行的点所对应最后一行中一定是连续的一段。有两种证明方法:(1、显然法:显然它是对的。2、反证法:反正它是对的。)
假设i小于k小于j若a出发,能到i,j,却不能到k,那么从a到i的路径和从a到j的路径和旱区那条边围成的区域中必定有一道能把k封闭起来的“墙”既然k被封闭起来了,那么其他所有的湖泊点都不能到达k。
然后区间线段覆盖问题,可以贪心,可以DP;
#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
int a[505][505];
int use[505][505];
int cx[]={
0,0,1,0,-1};
int cy[]={
0,1,0,-1,0};
queue<int> q;
int