zoj 1082

还木有吃中午饭,好饿。。速度打包去。。

/*
zoj_1082    最短路
题意:要在N个人中传播谣言,每个人传播谣言给他可以联系的人都有个时间,求从哪个人开始传播
      谣言并使谣言传遍所有人的时间最短。

基本上就是模板题,对每个人为起点都进行一次dijk,取最小就行。
*/
#include <iostream>
#include <cstdio>
#include <string.h>
#include <limits.h>
using namespace std;
int map[110][110];
int dist[110];
bool flag[110];

int dijkstra( int start,int n )
{
    int i,j,mark,mini,maxi;
    memset( dist,0,sizeof(dist) );
    memset( flag,0,sizeof(flag) );
    flag[start]=1;
    maxi=0;
    for( j=0;j<n;j++ )
    {
        mini=INT_MAX;
        for( i=1;i<=n;i++ )
        {
            if( flag[i]==0 )
            {
                if(  map[start][i]!=0 && dist[i]==0 )
                    dist[i]=dist[start]+map[start][i];
                else if( map[start][i]!=0 && dist[i]>dist[start]+map[start][i]  )
                    dist[i]=dist[start]+map[start][i];
                if( dist[i]<mini && dist[i]!=0 )
                {
                    mini=dist[i];
                    mark=i;
                }
            }
        }
        if( mini==INT_MAX ) break;
        if( dist[mark]>maxi )   maxi=dist[mark];
        flag[mark]=1;
        start=mark;
    }
    if( j==n-1 )  return maxi;
    else return INT_MAX;
}

int main()
{
    int n,m,i,j,k;
    int time,mini,temp,mark;
    while( scanf( "%d",&n ) && n )
    {
        memset( map,0,sizeof(map) );
        for( i=1;i<=n;i++ )
        {
            scanf( "%d",&m );
            for( j=0;j<m;j++ )
            {
                scanf( "%d%d",&k,&time );
                map[i][k]=time;
            }
        }
        mini=INT_MAX;
        for( i=1;i<=n;i++ )
            if( ( temp=dijkstra( i,n ) )<mini )
            {
                mark=i;
                mini=temp;
            }
        if( mini==INT_MAX ) printf( "disjoint\n" );
        else printf( "%d %d\n",mark,mini );
    }
    return 0;
}


你可能感兴趣的:(zoj 1082)