当前位置: 首页 > 知识库问答 >
问题:

图的直径计算算法的正确性

丁良骏
2023-03-14
    null

我相信这个答案是正确的,但我无法证明。有人能证明它为什么起作用或提供一个反例吗?

共有1个答案

公西翼
2023-03-14

假设不在parentmap中意味着是BFS树中的叶子,那么该算法是错误的。

设图有10个顶点和以下无向边:

0 1
0 4
1 2
1 3
2 3
2 6
2 7
3 8
4 5
4 6
5 9
6 7
6 8
7 8
7 9

有效的BFS树之一(根0)是:

0 1
1 2
1 3
2 7
3 8
0 4
4 6
4 5
5 9
pair<vector<int>, set<int>> bfs(int st, const vector<vector<int>>& g) {
    int n = g.size();
    vector<int> d(n, n);
    d[st] = 0;
    queue<int> q;
    q.push(st);
    set<int> parents;
    while (!q.empty()) {
        int v = q.front();
        q.pop();
        for (int to : g[v])
            if (d[to] > d[v] + 1) {
                d[to] = d[v] + 1;
                q.push(to);
                parents.insert(v);
            }
    }
    return {d, parents};
}

int get_max_dist(const vector<vector<int>>& g) {
    int res = 0;
    for (int i = 0; i < (int)g.size(); i++) {
        auto cur = bfs(i, g).first;
        for (int x : cur)
            cerr << x << " ";
        cerr << endl;
        res = max(res, *max_element(cur.begin(), cur.end()));
    }
    cerr << endl;
    return res;
}

int get_max_dist_weird(const vector<vector<int>>& g) {
    auto p = bfs(0, g);
    vector<int> cand;
    int n = g.size();
    for (int i = 0; i < n; i++)
        if (!p.second.count(i))
            cand.push_back(i);
    int res = 0;
    for (int i : cand) {
        auto cur = bfs(i, g).first;
        res = max(res, *max_element(cur.begin(), cur.end()));
    }
    return res;
}

vector<vector<int>> rand_graph(int n) {
    vector<vector<int>> g(n);
    for (int i = 0; i < n; i++)
        for (int j = i + 1; j < n; j++)
            if (rand() & 1) {
                g[i].push_back(j);
                g[j].push_back(i);
            }
    return g;
}

int main() {
    for (int i = 1;; i++) {
        int n = 10;
        auto g = rand_graph(n);
        int correct = get_max_dist(g);
        int got = get_max_dist_weird(g);
        if (correct != got) {
            cerr << correct << " " << got << endl;
            for (int v = 0; v < n; v++)
                for (int j : g[v])
                    if (v < j)
                        cerr << v << " " << j << endl;
        }
        assert (get_max_dist_weird(g) == get_max_dist(g));
        if (i % 1000 == 0)
            cerr << i << endl;
    }
}
 类似资料:
  • 我正在尝试匹配从服务器下载的文件的md5sum。只有当总和匹配时,处理才会继续。 上面的代码并没有每次为某些文件正确提供md5sum。 当我去控制台检查md5sum时 下载文件的vimdiff未提供任何差异。。下载后的文件是正确的。 我无法在上述代码中看到问题。 我正在尝试更改缓冲区大小。但没有运气,所以我猜这不是因为缓冲区大小等。 问候Dheeraj Joshi

  • 我需要阅读由AutoCAD导出为PDF的平面图,并使用PDFBox在上面放置一些带有文本的标记。除了文字宽度的计算之外,一切都很顺利,文字的宽度写在标记旁边。 我浏览了整个PDF规范,详细阅读了其中涉及图形和文本的部分,但没有任何效果。据我所知,字形坐标空间设置在用户坐标空间的1/1000处。因此,宽度需要放大1000倍,但仍然是实际宽度的一小部分。 这就是我为定位文本所做的: *0.043f可以

  • 目前我正在为学校做一个项目,下面是要求: 编写一个Temperature类,它将保持以华氏为单位的温度,并提供获取以华氏、摄氏度和开尔文为单位的温度的方法。该类应具有以下字段: :保持华氏温度的倍增器。 该类应具有以下方法: :构造函数接受华氏温度(双倍)并将其存储在ftemp字段中。 :set Fahrenheit方法接受一个华氏温度(作为双值),并将其存储在ftemp字段中。 :返回ftemp

  • 假设我有一个无向多图,即一个(G,E)对,其中G是一个有限的结点集,E是一个有限的边集。我正在寻找一个算法,将分配一个单一的字符串值到每个节点在以下的约束。 1. 每个节点都被赋予一组约束(可能是空的),这些约束限制了允许的值。我希望至少支持以下类型的值约束: null 有两种类型的边缘: 不同, 相同, 这意味着应该为相关节点分配不同/相同的值(意味着不相等/相等的字符串)。 null 这意味着

  • 我本以为GridPane会根据该列中所有元素的最大首选宽度计算每个列的默认宽度。然而,在我的代码中,它似乎计算的宽度太小,导致列中的一个标签被剪切。 下面是我的“cashflowform.fxml”: 这就是我设置舞台的方式(注意我没有设置任何大小,所以我让它自己计算大小): 结果: 正如你所看到的,第一列太小了,无法完全显示我的“安默空”标签。为什么会这样,解决这个问题的最好方法是什么? PS: