这题是典型的最短路径问题,这里我用的是Dijkstra 算法。Dijkstra 算法的时间复杂度为O(n^2),如果对于每一个点应用Dijkstra 算法,则总体时间复杂度为O(n^3)。
/*******************************************************************************
* Author : Neo Fung
* Email : neosfung@gmail.com
* Last modified : 2011-08-12 22:04
* Filename : ZOJ1082 POJ1125 Stockbroker Grapevine.cpp
* Description :
* *****************************************************************************/
// ZOJ1082 POJ1125 Stockbroker Grapevine.cpp : Defines the entry point for the console application.
//
// #include "stdafx.h"
#include <fstream>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <map>
#include <math.h>
#include <algorithm>
#include <numeric>
#include <functional>
#include <memory.h>
#include <limits>
using namespace std;
#define INFINITE numeric_limits<int>::max()
int main(void)
{
// ifstream cin("data.txt");
int n;
int num,dis,len;
int map[101][101];
int done[101]; //遍历节点
int path[101]; //暂时路径长度
while(cin>>n &&n)
{
int minindex,min=INFINITE;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
map[i][j]=INFINITE;
map[i][i]=0;
cin>>num;
for(int j=1;j<=num;++j)
{
cin>>dis>>len;
map[i][dis]=len;
}
}
for(int now=1;now<=n;++now)
{
for(int j=1;j<=n;++j)
{
path[j]=map[now][j];
}
memset(done,0,sizeof(done));
done[now]=1;
//对每个节点使用Dijkstra算法
for(int j=1;j<=n;++j)
{
int temp(INFINITE);
int tmpIndex;
for(int findmin=1;findmin<=n;findmin++)
{
if(!done[findmin] && path[findmin]<temp)
{
temp=path[findmin];
tmpIndex=findmin;
}
}
done[tmpIndex]=1;
path[tmpIndex];
for(int update=1;update<=n;++update)
{
if(!done[update] && (map[tmpIndex][update]<INFINITE)&&(path[update]>path[tmpIndex]+map[tmpIndex][update]))
{
path[update] = path[tmpIndex]+map[tmpIndex][update];
}
}
}
int temp(0);
for(int j=1;j<=n;++j)
{
if(path[j]>temp)
{
temp=path[j];
}
}
if(temp<min)
{
min=temp;
minindex=now;
}
}
if(min<INFINITE)
cout<<minindex<<' '<<min<<endl;
else
cout<<"disjoint"<<endl;
}
return 0;
}