现在的位置: 首页 > 综合 > 正文

POJ 1125 Floyd

2013年12月03日 ⁄ 综合 ⁄ 共 1144字 ⁄ 字号 评论关闭
 题目大意:     直接用 输入示例说明吧,  
3
2 2 4 3 5
2 1 2 3 6
2 1 2 2 2    表示 第一行表示一个股票经纪人需要向三个人传消息,第二行表示 第一个人有两个朋友, 向第二个朋友传消息需要 时间4 ,向第三个朋友发消息需要时间 5,第二行表示 第二个人有两个朋友,向第一个人传消息需要时间2,向第三个人传消息需要时间 6,第三行同样。
     求 能够 向所有人都传到消息并且需要的时间最短的人,以及 这个人向某个人传消息所花的最多的时间。 
    输出  3 2 。 即表示 让第三个人传消息 所需的时间最短, 他 向其他人传消息最多的一次用了 时间2。
    如果没有人可以 向所有人传递消息,输出 disjoint  
   解题思路: Floyd 算法。 即穷举断点 ,不断更新两点之间的 最小 距离。
                   装态转移方程 map[i,j]:=min{map[i,k]+map[k,j],map[i,j]}        。k表示 穷举得断点。
#include <stdio.h>  
#define INF 100000 //无穷大  
  
int num, a[101][101];  
  
void Floyd() //Floyd算法求最短路径  
{  
    int i, j, k;  
  
    //特别注意:循环的k,i,j的顺序不能改变。我测试过把顺序改为i,j,k就错了。  
    for (k=1; k<=num; k++)  
        for (i=1; i<=num; i++)  
            for (j=1; j<=num; j++)  
                if (a[i][k]+a[k][j] < a[i][j])  
                    a[i][j] = a[i][k] + a[k][j];  
    return;  
}  
  
int main()  
{  
    int i, j;  
    int m, contact, time, minTime, sum, max,person;  
  
    while (scanf("%d", &num) && num)  
    {  
        for (i=1; i<=num; i++)  
            for (j=1; j<=num; j++)  
            {  
                if (i != j) a[i][j] = INF;  
                else        a[i][j] = 0;  
            }  
        for (i=1; i<=num; i++)  
        {  
            scanf("%d", &m);  
            for (j=1; j<=m; j++)  
            {  
                scanf("%d %d", &contact, &time);  
                a[i][contact] = time;  
            }  
        }  
  
        Floyd(); //调用Floyd函数  
        minTime = INF;  
        for (i=1; i<=num; i++)  
        {  
            sum = 0;
            int tmax=0;  
            for (j=1; j<=num; j++)  
            {  
                sum+=a[i][j];
                if(a[i][j]>tmax)
                   tmax=a[i][j];
                //if(sum>=INF) break;
            }  
            if (sum < minTime)  
            {  
                minTime = sum;  
                person = i; 
                max=tmax; 
            }  
        }  
        if (minTime != INF)   printf("%d %d\n", person, max);  
        else                  printf("disjoint\n");  
    }  
    return 0;
}  

抱歉!评论已关闭.