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;
}

 

转载于:https://www.cnblogs.com/ts65213/p/3148058.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值