Stockbroker Grapevine (poj1125)Floyd-Warshall

#include <iostream>
using namespace std;

#define INF 1000000
const int MAX=100;
int dis[MAX+10][MAX+10];  //存放最短路
int n;  //人数
int loc;

void Floyd() 
{
 for (int k=1;k<=n;k++)
 {
  for (int i=1;i<=n;i++)
  {
   for (int j=1;j<=n;j++)
   {
    if (dis[i][j]>dis[i][k]+dis[k][j])
    {
     dis[i][j]=dis[i][k]+dis[k][j];
    }
   }
  }
 }
}

void Min()
{
 int i,j;
 int max,min=INF;
 for (i=1;i<=n;i++)
 {
  max=0;  //从i开始的最长路
  for (j=1;j<=n;j++)
  {
   if (i!=j && dis[i][j]>max)
   {
    max=dis[i][j];
   }
  }
  if (max<min)  //最长中求最短
  {
   loc=i;
   min=max;
  }
 }
 (min<100000) ? printf("%d %d\n",loc,min) : printf("disjoint\n");
}

int main()
{
 //freopen("in.txt","r",stdin);
 int i,j,k,p,q;
 while (scanf("%d",&n) && n)
 {
  /*用Floyd之前先要初始化*/
  for (i=1;i<=n;i++)
  {
   for (j=1;j<=n;j++)
   {
    dis[i][j]=INF;
   }
  }
  /*输入数据*/
  for (i=1;i<=n;i++)
  {
   scanf("%d",&k);
   for (j=1;j<=k;j++)
   {
    scanf("%d%d",&p,&q);
    dis[i][p]=q;
   }
  }
  Floyd();
  Min();
 }
 return 0;
}

posted @ 2011-03-05 20:18  acm_poj  阅读(93)  评论(0)    收藏  举报