poj 1125

题意是有N个股票经济人可以互相传递消息,他们之间存在一些单向的通信路径。现在有一个消息要由某个人开始传递给其他所有人,问应该由哪一个人来传递,才能在最短时间内让所有人都接收到消息。若不存在这样一个人,则输出disjoint。

这是一道多源最短路,所以用floyd来做会比较好。

代码里有备注。

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<set>
#define inf 20
using namespace std;
int dist[105][105];
int n;
void floyd()
{
    int i,j,k;
    for(k=1;k<=n;k++)
        for(i=1;i<=n;i++)                                                  //for(i=1;i<=n-1;i++)
            for(j=1;j<=n;j++)      //注意,只有无向图(双向边权相等)才可以使用for(j=i+1;j<=n;j++),这是因为无向图的邻接矩阵有对称性
                if(i!=j && dist[i][j] > dist[i][k] + dist[k][j])  //i!=j是因为无向图的顶点(一般)不存在环
                    dist[i][j] = dist[i][k] + dist[k][j];

    int maxlength;
    int min_in_max=inf;
    int flag_source;

    for(i=1;i<=n;i++)                     //以i点作为各通路源点
    {
        maxlength=0;
        for(j=1;j<=n;j++)
            if(i!=j && maxlength<dist[i][j])   //寻找i到j的最长路径
                maxlength=dist[i][j];
        if(min_in_max>maxlength)
        {
            min_in_max=maxlength;       //寻找最长路径中的最短路
            flag_source=i;              //该短路所在路径的源点记录
        }
    }
    if(min_in_max<inf)
        printf("%d %d\n",flag_source,min_in_max);
    else
        printf("disjoint\n");
    return;
}
int main()
{
    int i,j,k;
    while(1)
    {
        memset(dist,inf,sizeof(dist));
        scanf("%d",&n);
        if(!n)break;
        for(i=1;i<=n;i++)
        {
            int pair;
            scanf("%d",&pair);
            for(j=1;j<=pair;j++)
            {
                int cat,time;      //i的接触人,接触时间(边权)
                scanf("%d%d",&cat,&time);
                dist[i][cat]=time;
            }
        }
        floyd();
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值