POJ1797 -- Dijkstra算法

先大致解释一下题意, 求得是从街道1出发,到街道n,可以运输的最大重量。

该题用的是Dijkstra算法。大致思路如下:

int Graph[1001][1001]; //街道i到街道j的重量
int flag[1001];   //标记是否访问过
int Dis[1001];  //点1到每个点的最大重量

1.定义了三个数组

2.求得距离街道1最大重量的那个街道。此时是街道3,Dis[3] 为4

3.在最大值的基础上,判断是否需要更新Dis[ ] 的值。eg: Dis[2](值为3) 是和 Dis[3] 和 Graph[3][2] 的最小距离 (Min(4,5))进行比较 。所以Dis[2]更新为4.

下面查看全部源码:

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

int n,m,scenario;
int Graph[1001][1001]; //街道i到街道j的最大重量
int flag[1001];   //标记是否访问过
int Dis[1001];  //点1到每个点的最大重量

int Min(int a, int b){
    if(a<b){
        return a;
    }else{
        return b;
    }
}

void Dijkstra(){
    int i, j;
    flag[1]=1;
    for(i=1;i<=n;i++){
        Dis[i]=Graph[1][i];
    }
    for(i=1;i<n;i++){ //每次求一个与街道1重量最大的顶点,求n-1次
        int max = 0;
        int index =0;
        for(j=1;j<=n;j++){  //寻找距离顶点1的最大重量
            if(flag[j]==0 && max < Dis[j]){
                max = Dis[j];
                index = j;
            }
        }

        flag[index]=1;

        for(j=1;j<=n;j++){  //更新最大重量

            if(flag[j]==0 && Graph[index][j]!= 0 && Dis[j] < Min(max,Graph[index][j])){ // 区别: 1到2的重量,取决于1到3 和 3到2的最小值,
                Dis[j] = Min(max,Graph[index][j]);
            }
        }

    }
}

int main()
{
    int i;
    int num=1;

    freopen("input.txt","r",stdin);
    scanf("%d",&scenario);
    while(scenario--){
        memset(Graph,0,sizeof(Graph));
        memset(flag,0,sizeof(flag));
        memset(Dis,0,sizeof(Dis));
        scanf("%d%d",&n,&m); //n个顶点,m条边
        int x,y,d;
        for(i=0;i<m;i++){
            scanf("%d%d%d",&x,&y,&d);
            Graph[x][y] = d;
            Graph[y][x] = d;
        }
        Dijkstra();

        printf("Scenario #%d:\n",num++);
        printf("%d\n\n",Dis[n]);

    }

    return 0;
}


 最后,总结一下Floyed和Disjkstr算法之间的区别:

Floyed: 多源最短路径,计算的是各个点之间的最短路径。

Disjkstr: 单源最短路径,计算的是一个源点到各个点的最短路径。

 

猜你喜欢

转载自blog.csdn.net/genius9_9/article/details/46427911