posts - 100,  comments - 15,  trackbacks - 0
//每对顶点之间的最短路径算法floyd,其实是动归,O(n3),还要注意disjoint
#include<iostream>
using namespace std;
#define M 100
#define INF 20000000

int sb[M+1][M+1];
int d[M+1][M+1];
int n;
int i,j,k;

void Init()
{
    
    
for(i=1;i<=n;i++)
        
for(j=1;j<=n;j++)
            sb[i][j]
=(i==j?0:INF);
}



void floyd()
{
    
for(i=1;i<=n;i++)
        
for(j=1;j<=n;j++)
            d[i][j]
=sb[i][j];
    
for(k=1;k<=n;k++)
        
for(i=1;i<=n;i++)
            
for(j=1;j<=n;j++)
                
if(d[i][k]+d[k][j]<d[i][j])
                    d[i][j]
=d[i][k]+d[k][j];
}

int main()
{
    
int mi,v,w,ri,min,max;
    
while( scanf("%d",&n)==1 && n!=0)
    
{
        Init();
        
for(i=1;i<=n;i++)
        
{    
            scanf(
"%d",&mi);
            
for(j=1;j<=mi;j++{ scanf("%d%d",&v,&w); sb[i][v]=w; }
        }

        floyd();
        min
=INF;
        ri
=-1;
        
for(i=1;i<=n;i++)
        
{
            max
=0;
            
for(j=1;j<=n;j++)
                
if(d[i][j]>max) max=d[i][j];
            
if(max<min) { min=max;ri=i;}
        }

        
if(ri==-1) printf("disjoint\n");
        
else printf("%d %d\n",ri,min);
    }

    
return 0;
}
posted on 2009-05-24 16:17 wyiu 阅读(143) 评论(0)  编辑 收藏 引用 所属分类: POJ

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理