这道题就是求all pairs shortest paths。所以可以跑N次Dijkstra或SPFA(shortest path faster algoritm: http://en.wikipedia.org/wiki/Shortest_Path_Faster_Algorithm),或者floyd-warshall或者johnson's algorithm(http://en.wikipedia.org/wiki/Johnson%27s_algorithm)。最简单的应该就是floyd了。
这里参照的是wiki上的伪代码:http://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm
1125 | Accepted | 752K | 0MS | G++ | 1699B |
/*
ID: thestor1
LANG: C++
TASK: poj1125
*/
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <limits>
#include <string>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <cassert>
using namespace std;
const int MAXN = 100;
std::vector<std::vector<int> > dis(MAXN, std::vector<int>(MAXN, -1));
int main()
{
int N;
while (cin >> N && N)
{
for (int u = 0; u < N; ++u)
{
for (int v = 0; v < N; ++v)
{
dis[u][v] = -1;
}
dis[u][u] = 0;
}
for (int u = 0; u < N; ++u)
{
int n;
cin >> n;
for (int i = 0; i < n; ++i)
{
int v, w;
cin >> v >> w;
dis[u][v - 1] = w;
}
}
for (int k = 0; k < N; ++k)
{
for (int u = 0; u < N; ++u)
{
for (int v = 0; v < N; ++v)
{
if (u != v && dis[u][k] >= 0 && dis[k][v] >= 0 && (dis[u][v] < 0 || dis[u][v] > dis[u][k] + dis[k][v]))
{
dis[u][v] = dis[u][k] + dis[k][v];
}
}
}
}
int minu, mindis = -1;
for (int u = 0; u < N; ++u)
{
int maxdis = 0;
bool disjoint = false;
for (int v = 0; v < N; ++v)
{
if (dis[u][v] < 0)
{
disjoint = true;
break;
}
if (v != u && dis[u][v] > maxdis)
{
maxdis = dis[u][v];
}
}
if (disjoint)
{
continue;
}
if (mindis < 0 || maxdis < mindis)
{
minu = u;
mindis = maxdis;
}
}
if (mindis < 0)
{
cout << "disjoint" << endl;
}
else
{
cout << minu + 1 << " " << mindis << endl;
}
}
return 0;
}