nicholas

nicholas
pku1125
最短路径(多源floyd_warshall邻接阵)  模板很爽

#include <iostream>
using namespace std;


//多源最短路径,floyd_warshall算法,复杂度O(n^3)
//求出所有点对之间的最短路经,传入图的大小和邻接阵
//返回各点间最短距离MIN[]和路径pre[],pre[i][j]记录i到j最短路径上j的父结点
//可更改路权类型,路权必须非负!
#define MAXN 110
#define inf 1000000000
typedef int elem_t;

void floyd_warshall(int n,elem_t mat[][MAXN],elem_t MIN[][MAXN],int pre[][MAXN]){
 int i,j,k;
 for (i=0;i<n;i++)
  for (j=0;j<n;j++)
   MIN[i][j]=mat[i][j],pre[i][j]=(i==j)?-1:i;
 for (k=0;k<n;k++)
  for (i=0;i<n;i++)
   for (j=0;j<n;j++)
    if (MIN[i][k]+MIN[k][j]<MIN[i][j])
     MIN[i][j]=MIN[i][k]+MIN[k][j],pre[i][j]=pre[k][j];
}


elem_t graph[MAXN][MAXN],MIN[MAXN][MAXN];
int pre[MAXN][MAXN];
int n;

bool init()
{
 int i,j,k,t,c;

 cin>>n;
 if (n==0) return false;


 for (i=1;i<=n;i++)
  for (j=1;j<=n;j++)
   graph[i-1][j-1]=inf;

 for (i=1;i<=n;i++)
 {
  cin>>k;
  for (j=0;j<k;j++)
  {
   cin>>t>>c;
   graph[i-1][t-1]=c;
  }
 }
 return true;

}

int get_ans(int &u)
{
 int i,j,m;

 floyd_warshall(n,graph,MIN,pre);

 int ans=inf;

 for (i=0;i<n;i++)
 {
  m=0;
    for (j=0;j<n;j++)
     if (i!=j)
      if (MIN[i][j]>m)
       m=MIN[i][j];
  if (m<ans)
  {  ans=m;u=i;}
 }
 return ans;
}


 

int main()
{
 while (init())
 {
  int x;
  int ans=get_ans(x);

  if (ans==inf)
   cout<<"disjoint"<<endl;
  else
  
   cout<<x+1<<' '<<ans<<endl;
  
 }
 return 0;
}

posted on 2007-09-06 20:41  zy_nic  阅读(451)  评论(0)    收藏  举报