POJ1125 -- Floyed算法

该题求的是,从哪一个股票经纪人出发,可以最快的将消息传递。

1.用Floyed算法求出,任何俩个股票经纪人之间传递消息的最小时间。

Floyed算法其实就是三个for循环:假设如何俩个点之间都经过i点进行中转。

        for(i=1;i<=N;i++){ //所有的点都经过i点中转

                for(j=1;j<=N;j++){  //遍历所有点,途经i点

                    for(k=1;k<=N;k++){
                        if(Graph[j][k] > Graph[j][i]+Graph[i][k]){
                            Graph[j][k] = Graph[j][i]+Graph[i][k];
                        }
                    }

                }
        }


 

2. 分别求出从股票经纪人1,2,3....N 出发,传递消息所需的时间t1,t2,t3...tn(即每一行找一个最大值)。

3. 在这些t1,t2,t3..tn时间里找一个最小值,就是我们所需要的传递消息的最快时间。

全部源码如下:

#include <stdio.h>
#include <stdlib.h>

#define INFI 65535
int Graph[101][101];

int main()
{
    //freopen("input.txt","r",stdin);
    while(1){
        int N;
        int i=0,j=0 ,k=0;
        for(i=0;i<101;i++){
            for(j=0;j<101;j++){
                if(i==j){
                    Graph[i][j]=0;
                }else{
                   Graph[i][j]=INFI;
                }
            }
        }
       // memset(Graph,INFI,sizeof(Graph));  //不能对int型数组使用memset初始化为INFI

        scanf("%d",&N);  //N --> 联系人的个数
        if(N==0)
            break;

        for(i=1;i<=N;i++){
            int contact;
            scanf("%d",&contact);
            for(j=1;j<=contact;j++){
                int index;
                scanf("%d",&index);
                scanf("%d",&Graph[i][index]); //初始化图,Graph[1][2]表示联系人1发送消息给联系人2的最短时间

            }
        }

        for(i=1;i<=N;i++){ //所有的点都经过i点中转

                for(j=1;j<=N;j++){  //遍历所有点,途经i点

                    for(k=1;k<=N;k++){
                        if(Graph[j][k] > Graph[j][i]+Graph[i][k]){
                            Graph[j][k] = Graph[j][i]+Graph[i][k];
                        }
                    }

                }
        }
        int min = INFI;
        int index1=0;

        for(i=1;i<=N;i++){
            int max =0;
            int flag =0;
            int index2 =0;
            for(j=1;j<=N;j++){ //每一行找一个最大值
                if(Graph[i][j] == INFI){  //该行不通
                    flag =1;
                    break;
                }
                if( max <= Graph[i][j]){
                    max=Graph[i][j];
                    index2 = i;
                }
            }
            if(flag==0 && min>max){  //将每一行的最大值比较,找一个最小值
                min =max;
                index1 = index2;
            }

        }

        if(index1 == 0){
            printf("disjoin\n");
        }else {
            printf("%d %d\n",index1,min);

        }

    }

    return 0;
}


 

猜你喜欢

转载自blog.csdn.net/genius9_9/article/details/46428605
今日推荐