BZOJ 1295 最长距离

我还在纳闷怎么找最长的距离。。。。

blutrex说枚举点对。

。。。。。我擦。。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<algorithm>
#define maxv 905
#define maxe 180050
#define inf 0x7f7f7f7f
using namespace std;
int n,m,t,map[35][35],dis[35][35],ans=0;
int dx[]={0,-1,0,1,0},dy[]={0,0,1,0,-1};
bool vis[35][35];
queue <int> q;
char s[40];
bool judge(int x,int y)
{
    if ((x>=1) && (x<=n) && (y>=1) && (y<=m))
        return true;
    return false;
}
bool spfa(int sx,int sy)
{
    while (!q.empty()) q.pop();
    memset(vis,false,sizeof(vis));
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
            dis[i][j]=inf;
    q.push(sx);q.push(sy);vis[sx][sy]=true;dis[sx][sy]=map[sx][sy];
    while (!q.empty())
    {
        int nowx=q.front();q.pop();
        int nowy=q.front();q.pop();
        vis[nowx][nowy]=false;
        for (int i=1;i<=4;i++)
        {
            int tx=nowx+dx[i],ty=nowy+dy[i];
            if (judge(tx,ty))
            {
                if (dis[tx][ty]>dis[nowx][nowy]+map[tx][ty])
                {
                    dis[tx][ty]=dis[nowx][nowy]+map[tx][ty];
                    if (!vis[tx][ty])
                    {
                        vis[tx][ty]=true;
                        q.push(tx);q.push(ty);
                    }
                }
            }
        }
    }
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
        {
            if (dis[i][j]<=t)
                ans=max(ans,(i-sx)*(i-sx)+(j-sy)*(j-sy));
        }
}
int main()
{
    scanf("%d%d%d",&n,&m,&t);
    for (int i=1;i<=n;i++)
    {
        scanf("%s",s);
        for (int j=1;j<=m;j++)
            map[i][j]=s[j-1]-‘0‘;
    }
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
            spfa(i,j);
    double anss=sqrt(ans);
    printf("%.6lf\n",anss);
    return 0;
}
时间: 2024-10-18 05:17:29

BZOJ 1295 最长距离的相关文章

BZOJ 1295 最长距离(最短路)

考虑到矩阵尺寸的关系,可以枚举起点和终点,并且判断是否可行即可. 判断起点和终点是否可以通过挖空至多T个障碍联通.实际上就是求起点到终点的最短路. 所以我们先建好图,然后求以每个方格为起始点的最短路,复杂度O(n*m^2*logm). 枚举起点和终点更新答案的复杂度是O(n^2*m^2). 总复杂度就是(nm(nm+mlogm)). # include <cstdio> # include <cstring> # include <cstdlib> # include

【BZOJ 1295】 [SCOI2009]最长距离

1295: [SCOI2009]最长距离 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 945  Solved: 492 [Submit][Status][Discuss] Description windy有一块矩形土地,被分为 N*M 块 1*1 的小格子. 有的格子含有障碍物. 如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离. 如果从格子A不可以走到格子B,就没有距离. 如果格子X和格子Y有公共边,并且X和Y

[BZOJ 1295][SCOI2009]最长距离(SPFA+暴力)

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1295 分析:很巧妙的一道spfa从搜索的角度是搜索在所有1中搜索删除哪T个1,对整个图询问,这样肯定TLE 不妨反过来想一想:对于两个点,弄出联通这两个点所需删除的最少的1,那么就知道这两个点是否可以作为题目要求的起点和终点,如果满足算一下结果和ans比较一下就可以. 所以算法就出来了: 枚举起点(S,T),用SPFA跑出图上的所有点到起点这条路径联通的最少删除的1,那么ans=max(di

bzoj 1295: [SCOI2009]最长距离 暴力+bfs最短路

题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=1295 题解: 对每个点暴力跑一遍bfs,看能够到达的最远位置,这里如果有障碍物则距离为1,如果没有障碍物,则距离为0,用bfs跑距离<=t的所有点并更新答案. 代码: #include<iostream> #include<cstring> #include<cstdio> #include<utility> #include<queu

bzoj 1295: [SCOI2009]最长距离

1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 using namespace std; 6 int n,m,T; 7 double ans=0; 8 bool mp[31][31],inq[31][31],vis[31][31]; 9 int dis[31][31]; 10 int dx[4]={1,-1,0,0}; 11 int dy[4]={

BZOJ 1295 SCOI 2009 最长距离 SPFA

题目大意:给出一张地图,上面有些点有障碍物,现在有T个机会能够移除障碍物,问地图上最长的欧几里得距离是多长. 思路:在原图的基础上建图,f[i]表示的是起点到这里最少需要移除多少个障碍物,然后暴力枚举起点,更新答案即可. CODE: #include <map> #include <queue> #include <cmath> #include <cstdio> #include <iomanip> #include <cstring&g

BZOJ 1295 SCOI2009 最长距离 SPFA+暴力

题目大意:给定一个棋盘,一些格子上有障碍物,可以移除T个障碍物,求移除后所有能互相到达的点对中的最大欧几里得距离 m,n<=30,900个点,我们可以枚举起始点,跑一遍SPFA,求出所有经过不超过T个障碍物可达的点,统计ans即可 #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define M 40 usi

(SPFA) bzoj 1295

1295: [SCOI2009]最长距离 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 922  Solved: 478[Submit][Status] Description windy有一块矩形土地,被分为 N*M 块 1*1 的小格子. 有的格子含有障碍物. 如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离. 如果从格子A不可以走到格子B,就没有距离. 如果格子X和格子Y有公共边,并且X和Y均不含有障碍物,就可以

1295: [SCOI2009]最长距离

1295: [SCOI2009]最长距离 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 960  Solved: 498[Submit][Status][Discuss] Description windy有一块矩形土地,被分为 N*M 块 1*1 的小格子. 有的格子含有障碍物. 如果从格子A可以走到格子B,那么两个格子的距离就为两个格子中心的欧几里德距离. 如果从格子A不可以走到格子B,就没有距离. 如果格子X和格子Y有公共边,并且X和Y均不