本文共 1700 字,大约阅读时间需要 5 分钟。
题意很难懂,一个人可以同时向多个人传递信息,我们需要找出每个人向所有人传递完信息后的最大值,然后再找出这些最大值中的最小值,这就是结果。
假设有t个人,每个人可以向其他人传递信息。信息量可以看作是权重。对于每个人i,我们需要计算他传递给所有人j的信息量的最大值。然后,在这些最大值中找到最小的那个。
举个例子,假设有3个人A、B、C:
对于A来说,传递给B的信息量是3,给C的是5,所以最大值是5。 对于B来说,传递给A的是2,给C的是4,最大值是4。 对于C来说,传递给A的是1,给B的是3,最大值是3。 这些最大值分别是5、4、3,最小的那个是3,所以结果就是3。
代码实现:
代码示例:
#include#include #include #define INF 0x3f3f3fusing 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/