题目很简单,floyd很容易记忆,理解所谓的“松弛”就行,变量依次为k,i,j。
求图G中任意两点的最短路径;对每一个stockbroker看是否能传播给其他人信息,若都能,找到min_time,最后比较若干个stockbroker的min_time,找到最小的那个。
#include<iostream>
#include<fstream>
using namespace std;
const int MAX = 0xfffffff;
int dist[101][101];//max map
int n;//number of stockbrokers
void floyd()
{
for (int k = 1; k <= n; k++)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (dist[i][j] > dist[i][k] + dist[k][j])
{
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
}
}
int main()
{
//ifstream in("text.txt");
while (cin >> n && n!=0)
{
//init
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (i != j)
dist[i][j] = MAX;
else
dist[i][j] = 0;
}
}
//input
for (int i = 1; i <= n; i++)
{
int pair;
cin >> pair;
for (int j = 1; j <= pair; j++)
{
int client, time;
cin >> client >> time;
dist[i][client] = time;
}
}
floyd();
//handle start client & min time
int ans=MAX,tmin;
bool disjoint;
int start;
for (int i = 1; i <= n; i++)
{
tmin = -1;
disjoint = false;
for (int j = 1; j <= n && !disjoint; j++)
{
if (i!=j && dist[i][j]==MAX)
{
disjoint = true;
}
if (i != j && dist[i][j] > tmin)
{
tmin = dist[i][j];
}
}
if (!disjoint && tmin<ans)
{
disjoint = false;
ans = tmin;
start = i;
}
}
//output
if (ans == MAX)
cout << "disjoint" << endl;
else
cout << start << " " << ans<<endl;
}
//system("pause");
return 0;
}