poj 1125 最短路

题意:股票经纪人要在一群人中散布一个传言,传言只能在认识的人中传递,题目将给出人与人的关系(是否认识),以及传言在某两个认识的人中传递所需的时间,要求程序给出以哪个人为起点,可以在好事最短的情况下,让所有人收到消息。

分析:先求出每个人向其他人发信息所用的最短时间,然后在所有能向每个人发信息的人中比较他们所用最大时间,找出所用最大时间最小的那一个。

 

 

#define M 105

int maze[M][M],n;
//int pre[M][M];

void floyd_warshall(){
    FOR(k,0,n)
        FOR(i,0,n){
            if(i==k)continue;
            FOR(j,0,n)
                if(maze[i][j]>maze[i][k]+maze[k][j]){
                    maze[i][j]=maze[i][k]+maze[k][j];
                    //pre[i][j]=pre[k][j];
                }
        }
}

void build(){
    memset(maze,0x3f,sizeof maze);//7f的话,相加得负出错
    //memset(pre , -1, sizeof pre);
    FOR(i,0,M) {
        maze[i][i]=0;
        //pre[i][i]=i;
    }

    int a,b,m;
    //cin>>n;
    FOR(i,0,n){
        cin>>m;
        while(m--){
            cin>>a>>b;
            maze[i][a-1]=b;             //if(i==3) cout<<"AAAAA  "<<a<<' '<<b<<endl;
        }
    }
}

int maxx,maid;
void solve(){
    maxx=9999999; maid=-1;
    FOR(i,0,n){
        int ma=-1,flag=i;
        FOR(j,0,n){
            if(maze[i][j]>9999999){
                flag=-1;
                break;
            }
            if(ma<maze[i][j]){
                ma=maze[i][j];
            }
        }
        if(flag!=-1)
            if(maxx>ma){
                maxx=ma;
                maid=i;
            }
    }
}

int main(){                         //     READ
    while(cin>>n,n){
        build();
        floyd_warshall();
        solve();
        if(maid!=-1)cout<<maid+1<<' '<<maxx<<endl;
        else cout<<"disjoint"<<endl;
    }

    return 0;
}

 

posted @ 2013-06-21 13:25  心向往之  阅读(250)  评论(0编辑  收藏  举报