题目概述:
这道题的大意是说,在股市中特定的人之间都有各自的联系,且对于每一条关系,从一个人传递谣言到另一个人的时间是不同的。然后我们的目标是要散布一条谣言,判断出应该从谁开始传播,才可以让这条谣言传播完整个人际关系网络,并且算出传递到最后一个人的时间是多少。
另外说一句,这道题的数据非常弱的,估计没有多少个超过20的点的图。而且看别人的博客也没有输入非连通的情况。
算法思想:
因为这明显是一个图求最短路径的题,并且要试一下每一个点为源点的情况,所以我就决定用Floyd来算。
首先把每一个人当作图中的一个顶点,每一个关系当作一条边,这段关系的消息传递时间当作这条边的权重,初始化时候把自己到自己的距离初始为0,其他的都为INF。
然后用佛洛依德算法计算出各点距离。
然后依次枚举每一个点,看从这点到整个网络点的距离的最大值,记下这时候的起点值。
再从这些最大值中取得一个最小的,输出其起点值和这个最小值。
完毕。
代码部分:
#include <iostream> #include <list> #include <map> #include <string.h> #include <string> #include <algorithm> using namespace std; map<string, int> mymap; const int INF = 10000000; int n, m, a, b; double d[117][117]; void floyd() { for (int k = 1; k <= n; k++) { for (int j = 1; j <= n; j++) { for (int i = 1; i <= n; i++) { if (d[i][j] > d[i][k] + d[k][j]) d[i][j] = d[i][k] + d[k][j]; } } } } int main(){ while (cin >> n && n) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (i != j) d[i][j] = INF; else d[i][j] = 0; } } for (int i = 1; i <= n; i++) { cin >> m; for (int j = 1; j <= m; j++) { cin >> a >> b; d[i][a] = b; } } floyd(); int p = INF, q = 0; int y = 0; for (int i = 1; i <= n; i++) { int res = 0; for (int j = 1; j <= n; j++) { if (res <= d[i][j]) { res = d[i][j]; q = j; } } if (p >= res) { p = res; y = i; } } if (p!=INF) cout << y <<" "<< p << endl; else cout << "disjoint" << endl; } return 0; }