bzoj 1295: [SCOI2009]最长距离
生活随笔
收集整理的這篇文章主要介紹了
bzoj 1295: [SCOI2009]最长距离
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接
1295: [SCOI2009]最長距離
Time Limit:?10 Sec??Memory Limit:?162 MBSubmit:?1165??Solved:?619
[Submit][Status][Discuss]
Description
windy有一塊矩形土地,被分為 N*M 塊 1*1 的小格子。 有的格子含有障礙物。 如果從格子A可以走到格子B,那么兩個格子的距離就為兩個格子中心的歐幾里德距離。 如果從格子A不可以走到格子B,就沒有距離。 如果格子X和格子Y有公共邊,并且X和Y均不含有障礙物,就可以從X走到Y。 如果windy可以移走T塊障礙物,求所有格子間的最大距離。 保證移走T塊障礙物以后,至少有一個格子不含有障礙物。
Input
輸入文件maxlength.in第一行包含三個整數,N M T。 接下來有N行,每行一個長度為M的字符串,'0'表示空格子,'1'表示該格子含有障礙物。
Output
輸出文件maxlength.out包含一個浮點數,保留6位小數。
Sample Input
【輸入樣例一】3 3 0
001
001
110
【輸入樣例二】
4 3 0
001
001
011
000
【輸入樣例三】
3 3 1
001
001
001
Sample Output
【輸出樣例一】1.414214
【輸出樣例二】
3.605551
【輸出樣例三】
2.828427 看起來不好做, 但是轉換一下思路。 我們求出每一個格子到其他所有格子的最小花費, 也就是需要移除障礙的個數。 然后看這個數是否小于等于k, 如果小于, 更新ans。 #include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <set> #include <string> #include <queue> #include <stack> #include <bitset> using namespace std; #define pb(x) push_back(x) #define ll long long #define mk(x, y) make_pair(x, y) #define lson l, m, rt<<1 #define mem(a) memset(a, 0, sizeof(a)) #define rson m+1, r, rt<<1|1 #define mem1(a) memset(a, -1, sizeof(a)) #define mem2(a) memset(a, 0x3f, sizeof(a)) #define rep(i, n, a) for(int i = a; i<n; i++) #define fi first #define se second typedef pair<int, int> pll; const double PI = acos(-1.0); const double eps = 1e-8; const int mod = 1e9+7; const int inf = 1061109567; const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; int dis[35][35], vis[35][35], a[32][32], n, m; void spfa(int x, int y) {mem2(dis);mem(vis);queue <pll> q;vis[x][y] = 1;dis[x][y] = 0;q.push(mk(x, y));while(!q.empty()) {pll tmp = q.front(); q.pop();vis[tmp.fi][tmp.se] = 0;for(int i = 0; i<4; i++) {x = dir[i][0]+tmp.fi;y = dir[i][1]+tmp.se;if(x>=1&&x<=n&&y>=1&&y<=m) {if(dis[x][y]>dis[tmp.fi][tmp.se]+a[x][y]) {dis[x][y] = dis[tmp.fi][tmp.se]+a[x][y];if(!vis[x][y]) {vis[x][y] = 1;q.push(mk(x, y));}}}}} } double get_dis(int x, int y, int x1, int y1) {return sqrt(1.0*(x-x1)*(x-x1)+(y-y1)*(y-y1)); } int main() {int k;cin>>n>>m>>k;char s[32][32];for(int i = 1; i<=n; i++) {scanf("%s", s[i]+1);}for(int i = 1; i<=n; i++) {for(int j = 1; j<=m; j++)a[i][j] = s[i][j]-'0';}double ans = 0;for(int i = 1; i<=n; i++) {for(int j = 1; j<=m; j++) {if(a[i][j])continue;spfa(i, j);for(int x = 1; x<=n; x++) {for(int y = 1; y<=m; y++) {if(dis[x][y]<=k) {ans = max(ans, get_dis(i, j, x, y));}}}}}printf("%.6f\n", ans);return 0; }
?
轉載于:https://www.cnblogs.com/yohaha/p/5228935.html
總結
以上是生活随笔為你收集整理的bzoj 1295: [SCOI2009]最长距离的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每周公布病情 - 北京18区县均有手足口
- 下一篇: [转载] 我的Android进阶之旅:经