poj 1125 FLoyd

题意:

让你找一个点,从这个点向其它点传递信息所要的时间最短。输出这个点得编号,和最晚收到信息的人所需时间。

算法: 

1.Dijkstra算法一次只能求单源最短路径,而FLoyd算法则可以求出每对顶点得最短路径,求一次则可。

2.枚举每个点到各点的最大直,比较各点的最大直就可以得出答案。这个最大最大直就是最晚收到信息所需时间。

View Code
#include<stdlib.h>
#include<string.h>
#include<stdio.h>

int mp[210][210];
int N;
const int inf = 0x7f7f7f7f;


void Floyd( )
{
 for( int k = 1; k <= N; k++)
   for( int i = 1; i <= N; i++)
    for( int j = 1; j <= N; j++)
        {
            if( mp[k][j] != inf && mp[i][j] > mp[i][k] + mp[k][j] && mp[k][j] != inf )
             mp[i][j] = mp[i][k] + mp[k][j];
 
        }


}

void solve( )
{
  int maxn = inf, ans = 0;
  int minx = 0;
  for( int i = 1; i <= N; i++)
  {
      minx = 0;
    for( int j = 1; j <= N; j++)
    {
      if( mp[i][j] > minx )
         minx = mp[i][j];

    }
    if( minx < maxn )
    {
       maxn = minx;
       ans = i;
    }

  }
  if( ans == 0 )
    puts("disjoint");
  else
    printf("%d %d\n", ans, maxn);


}

int main( )
{
  int M, a, b;
  while( scanf("%d",&N), N )
  {
    for( int i = 1; i <= N; i++)
    for( int j = 1; j <= N; j++)
        mp[i][j] = ( i == j ) ? 0 : inf;
    for( int i = 1; i <= N; i++)
    {
        scanf("%d", &M);
        for( int j = 1; j <= M; j++)
        {
           scanf("%d%d", &a, &b);
           mp[i][a] = b;
        }
    }
    Floyd();
    solve( );     

  }
  return 0;
}

转载于:https://www.cnblogs.com/tangcong/archive/2012/07/12/2587350.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值