[SCOI]最长距离

[SCOI2009]最长距离

https://ac.nowcoder.com/acm/problem/20270

[SCOI]最长距离

题目大意

给你一个图,里面有障碍
你能移走个障碍,然后求能够联通的一个点对的最大距离是多少

分析

因为求的只是一个点对的最大距离,所以其实我们只需要一走这一条路径上的障碍即可

那么只要路径上的最小障碍数量小于等于就可以更细答案

求路径上的障碍数可以用最短路的思想,把点权看作边权即可

Code

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int maxn = 50 + 10;
const int mod = 1e9 + 7;

inline int __read()
{
    int x(0), t(1);
    char o (getchar());
    while (o < '0' || o > '9') {
        if (o == '-') t = -1;
        o = getchar();
    }
    for (; o >= '0' && o <= '9'; o = getchar()) {
        x = (x << 1) + (x << 3) + (o ^ 48);
    }
    return x * t;
}

int n, m, t, ans;
int dis[maxn][maxn], cost[maxn][maxn];
bool vis[maxn][maxn];
const int mx[] = {1, -1, 0, 0};
const int my[] = {0, 0, 1, -1};

struct Node
{
    int x, y;
    Node () {}
    Node (int x, int y) : x(x), y(y) {}
    bool operator < (const Node &T) const {
        return dis[x][y] > dis[T.x][T.y];
    }
};

void BFS(int fx, int fy)
{
    memset(dis, 0x3f, sizeof dis);
    memset(vis, 0, sizeof vis);
    priority_queue <Node> Q;
    dis[fx][fy] = cost[fx][fy];
    Q.push(Node(fx, fy));
    while (!Q.empty()) {
        Node Now = Q.top();
        Q.pop();
        if (vis[Now.x][Now.y]) continue;
        if (dis[Now.x][Now.y] <= t) {
            ans = max(ans, (fx - Now.x) * (fx - Now.x) + (fy - Now.y) * (fy - Now.y));
        } else continue;
        vis[Now.x][Now.y] = 1;
        for (int i(0); i < 4; ++i) {
            int nx = mx[i] + Now.x;
            int ny = my[i] + Now.y;
            if (nx < 1 || nx > n || ny < 1 || ny > m || vis[nx][ny]) continue;
            if (dis[nx][ny] <= cost[Now.x][Now.y] + cost[nx][ny]) continue;
            dis[nx][ny] = cost[Now.x][Now.y] + cost[nx][ny];
            Q.push(Node(nx, ny));
        }
    }
}

signed main()
{
    n = __read(), m = __read(), t = __read();
    for (int i = 1; i <= n; ++i) {
        char opt[maxn];
        scanf ("%s", opt + 1);
        for (int j = 1; j <= m; ++j)
            cost[i][j] = opt[j] - '0';
    }

    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= m; ++j)
            BFS(i, j);

    printf ("%.6f\n", sqrt(ans));
    system("pause");
}
有的没的 文章被收录于专栏

RT,有的没的

全部评论

相关推荐

头像
04-17 09:29
已编辑
湖南农业大学 后端
睡姿决定发型丫:本硕末9也是0offer,简历挂了挺多,只有淘天 美团 中兴给了面试机会,淘天二面挂,美团一面kpi面,中兴一面感觉也大概率kpi(虽然国企,但一面0技术纯聊天有点离谱吧)
点赞 评论 收藏
分享
头像
昨天 12:47
已编辑
中国地质大学(武汉) Java
你出生在农村,与其它农村小孩子无异小学时你对成绩没有概念,只感觉上课不听课也是无聊,只知道不写完作业会被老师罚站一到考试,自己成绩总是名列靠前,即使偶尔落后,你也从不在意中学时你觉得课本的东西很简单,随便学学就会了,并没有大量刷题你总是想不通,那些所谓的数学物理中难题,明明是在送分,为什么你的同学总是想不出解题方法高中时这三年你过的不容易,晚睡早起,给了自己很多压力.但是你也发现自己是有些小聪明的,你感觉班里有些同学很刻苦,但成绩比你差远了。那些数学题和物理题的陷阱,同学一遍遍踩坑,但是你总能发现并避开它们.“为了父母的期盼,为了恩师的厚望,为了天赐的智慧,为了青春的理想......”“天行健...
创作助手_刘北:其实,这种已经是神童级别的了,不费吹灰之力就能拿到自己想要的东西,就像机器按照程序走了一遍,就像我小时候看爱情公寓,觉得他们都很惨,几个人只能挤在一个房间里合租,但是好在他们有一群非常好的朋友,随着时间的推移,慢慢长大了,在看爱情公寓的时候,觉得他们都很厉害,博士、留学生、***、电台公子,数学天才,任何一个都是我可望而不可即的,更别说可以在异地认识一群更好的朋友了,所以呢,人还是要自给自足,满足当下,不要攀比,意气风发的且有理想的18岁少年永远都存在,只不过随着时间的推移他被你包裹在了洋葱的最深处。
点赞 评论 收藏
分享
评论
3
2
分享

创作者周榜

更多
牛客网
牛客企业服务