柑橘味砖头


私信TA

用户名:uq_73696371690

访问量:1520

签 名:

等  级
排  名 8324
经  验 1240
参赛次数 0
文章发表 17
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:可以将题目理解成一张图 同时每条边的长度就是1 并且每个点到其他点的最远距离都是一样的 所以存储了图之后跑一次dijkstra算法即可

注意事项:距离数组初始化成无穷大

参考代码:

#include<bits/stdc++.h>

#define INF 0x3f3f3f3f

using namespace std;

const int N = 1e5 + 5;

typedef pair<int, int> pii;

priority_queue<pii, vector<pii>, greater<pii>> q;//小根堆 每次弹出距离最近的点

vector<int> m[N];

bool vis[N];

int n, k, dis[N];

//将各个节点转化为一张有向图 因为任意点的最远距离是一样的 跑一次DJ即可

int main()

{   

    cin >> n >> k;

    for (int i = 0; i < n; i++) {

        m[i].push_back((i + 1) % n);

        m[i].push_back((i + k) % n);

    }

    memset(dis, INF, sizeof dis);

    q.push({ 0,0 });

    dis[0] = 0;

    while (!q.empty()) {

        auto temp = q.top(); q.pop();

        int u = temp.second;

        if (vis[u]) continue;

        vis[u] = 1;

        for (int v : m[u]) {

            if (dis[v] > dis[u] + 1) {

                dis[v] = dis[u] + 1;

                q.push({ dis[v],v });

            }

        }

    }

    int ans = *max_element(dis, dis + n);

    cout << ans << endl;

    return 0;

}


 

0.0分

0 人评分

  评论区

  • «
  • »