博客
关于我
poj 1125Stockbroker Grapevine(最短路)
阅读量:793 次
发布时间:2023-03-03

本文共 1700 字,大约阅读时间需要 5 分钟。

题意很难懂,一个人可以同时向多个人传递信息,我们需要找出每个人向所有人传递完信息后的最大值,然后再找出这些最大值中的最小值,这就是结果。

假设有t个人,每个人可以向其他人传递信息。信息量可以看作是权重。对于每个人i,我们需要计算他传递给所有人j的信息量的最大值。然后,在这些最大值中找到最小的那个。

举个例子,假设有3个人A、B、C:

  • A向B传递了3个单位,向C传递了5个单位。
  • B向A传递了2个单位,向C传递了4个单位。
  • C向A传递了1个单位,向B传递了3个单位。

对于A来说,传递给B的信息量是3,给C的是5,所以最大值是5。 对于B来说,传递给A的是2,给C的是4,最大值是4。 对于C来说,传递给A的是1,给B的是3,最大值是3。 这些最大值分别是5、4、3,最小的那个是3,所以结果就是3。

代码实现:

  • 读取输入,初始化一个101x101的数组w,值设为INF。
  • 遍历每个人i,读取n个信息对(v, w1),更新w[i][v]为w1。
  • 计算所有i、j、k,更新w[j][k]为w[j][i] + w[i][k],如果更大则更新。
  • 对每个i,找到他传递的最大值,然后在所有人的最大值中找最小的。
  • 代码示例:

    #include 
    #include
    #include
    #define INF 0x3f3f3f
    using namespace std;
    int w[101][101];
    int main() {
    int i, j, k, n, t, v, w1;
    while (scanf("%d", &t)) {
    memset(w, INF, sizeof(w));
    for (i = 1; i <= t; i++) {
    scanf("%d", &n);
    while (n--) {
    scanf("%d %d", &v, &w1);
    w[i][v] = w1;
    }
    }
    for (i = 1; i <= t; i++) {
    for (j = 1; j <= t; j++) {
    for (k = 1; k <= t; k++) {
    if (w[j][i] + w[i][k] > w[j][k]) {
    w[j][k] = w[j][i] + w[i][k];
    }
    }
    }
    }
    int min_val = INF, max_val;
    int x = 1;
    for (i = 1; i <= t; i++) {
    max_val = w[i][j];
    for (j = 1; j <= t; j++) {
    if (i != j && max_val < w[i][j]) {
    max_val = w[i][j];
    }
    }
    if (min_val > max_val) {
    min_val = max_val;
    }
    }
    printf("%d %d\n", x, min_val);
    }
    return 0;
    }

    这个代码读取输入,初始化数组,更新信息量,然后计算每个i的最大传递量,最后输出最小的最大值。

    转载地址:http://mkxfk.baihongyu.com/

    你可能感兴趣的文章