題目大意:
windy有一塊矩形土地,被分為 n*m 塊 1*1 的小格仔。 有的格仔含有障礙物。 如果從格仔a可以走到格仔b,那麼兩個格仔的距離就為兩個格仔中心的歐幾里德距離。 如果從格仔a不可以走到格仔b,就沒有距離。 如果格仔x和格仔y有公共邊,並且x和y均不含有障礙物,就可以從x走到y。 如果windy可以移走t塊障礙物,求所有格仔間的最大距離。 保證移走t塊障礙物以後,至少有乙個格仔不含有障礙物。
思路:
列舉兩點,計算出至少需要移開多少塊障礙物,用bfs就可以。
注意,如果每次都進行bfs,那麼將要進行(n*m)^2次bfs,會超時。
所以可以列舉起點進行bfs,每次bfs處理出到達其餘點需要移開的障礙物即可。這樣只需要進行(n*m)次bfs
1 #include2#define ios ios::sync_with_stdio(false);//
不可再使用scanf printf
3#define max(a, b) ((a) > (b) ? (a) : (b))//
禁用於函式,會超時
4#define min(a, b) ((a) < (b) ? (a) : (b))
5#define mem(a) memset(a, 0, sizeof(a))
6#define dis(x, y, x1, y1) ((x - x1) * (x - x1) + (y - y1) * (y - y1))
7#define mid(l, r) ((l) + ((r) - (l)) / 2)
8#define lson ((o)<<1)
9#define rson ((o)<<1|1)
10#define accepted 0
11#pragma comment(linker, "/stack:102400000,102400000")//
棧外掛程式12
using
namespace
std;
13 inline int
read()
1417
while (ch>='
0'&&ch<='9')
18return x*f;19}
2021 typedef long
long
ll;22
const
int maxn = 100 + 10;23
const
int mod = 1000000007;//
const引用更快,巨集定義也更快
24const
int inf = 1e9 + 7;25
const
double eps = 1e-6;26
double f(int a, int b, int x, int
y)27
31int dir[4][2] = ;
32char map[35][35
];33
bool vis[35][35
];34
35int
n, m, t;
36struct
node
3741 node(int x, int y, int
dis):x(x), y(y), dis(dis){}
42bool
operator
< (const node& a)const
4346
};47
int dis[35][35
];48
int bfs(int a, int
b)4969}
70}71}
72int
main()
7389}90
}91 printf("
%.6f\n
", ans);
92return
accepted;
93 }
bzoj 1295 最長距離 最短路
windy有一塊矩形土地,被分為 n m 塊 1 1 的小格仔。有的格仔含有障礙物。如果從格仔a可以走到格仔b,那麼兩個格仔的距離就為兩個格仔中心的歐幾里德距離。如果從格仔a不可以走到格仔b,就沒有距離。如果格仔x和格仔y有公共邊,並且x和y均不含有障礙物,就可以從x走到y。如果windy可以移走t...
BZOJ 1295 最長距離 最短路
考慮到矩陣尺寸的關係,可以列舉起點和終點,並且判斷是否可行即可。判斷起點和終點是否可以通過挖空至多t個障礙聯通。實際上就是求起點到終點的最短路。所以我們先建好圖,然後求以每個方格為起始點的最短路,複雜度o n m 2 logm 列舉起點和終點更新答案的複雜度是o n 2 m 2 總複雜度就是 nm ...
BZOJ1295 SCOI2009 最長距離
time limit 10 sec memory limit 162 mb submit 1719 solved 935 submit status discuss windy 有一塊矩形土地,被分為 n m 塊 1 1 的小格仔。有的格仔含有障礙物。如果從格仔a可以走到格仔b,那麼兩個格仔的距離就...