POJ2395 -- Prim算法

来源:互联网 发布:jquery.min.js用法 编辑:程序博客网 时间:2024/05/16 11:55

一。Prim算法和Dijkstra算法

1. Prim算法: 最小生成树,主要用于,N个村庄修路,怎么样成本最低。

2.Dijkstra算法:最短路径计算,主要用于,任何一个点到点1的最短距离。

区别:

Prim算法和Dijkstra算法在代码实现上,几乎一样,唯一有个区别在于:

Prim:      Graph[k][j] < dis[ j ]                 // dis[ j ]表示到j点最小的权值

Dijkstra: min+Graph[k][ j ] < dis[ j ]       // dis[ j ]表示点1到j点最小的距离

 

二。该题求得是最小生成树的最长边。需要注意的有俩点:

1. 输入的边上重复的,需要去重。

2.把最大值定义大点,否则容易WA。#define INFI 999999999

 

三。查看全部代码:

#include <stdio.h>#include <stdlib.h>#define MAX 2001#define INFI 999999999int N,M;int Graph[MAX][MAX];int dis[MAX]; //任意一个点到点i的最小距离int vis[MAX]; //标志位int outMax; //输出的最大值void prim(){    int i,j;    for(i=1;i<=N;i++){        dis[i] = Graph[1][i];    }    vis[1]=1;    for(i=1;i<N;i++){ //求到其余N-1个点的最短距离,N-1次        int min=INFI;        int k=0;        for(j=2;j<=N;j++){  //寻找距离顶点1的最大重量            if(vis[j]==0 && min>dis[j]){ //求到点1最短的那个点                min = dis[j];                k=j;            }        }        vis[k]=1;        if(outMax < min){            outMax = min;        }        for(j=2;j<=N;j++){ //更新到点j的最小距离。        if(vis[j]==0 && Graph[k][j] < dis[j]){  //与Dijsktra的唯一区别在于:min+Graph[k][j] < dis[j]            dis[j]= Graph[k][j];            }        }    }}int main(){    //freopen("input.txt","r",stdin);    scanf("%d%d",&N,&M);    int i,j;    for(i=0;i<=N;i++){ //点1到任何点的最短距离        dis[i]=INFI;        vis[i]=0;    }    for(i=0;i<=N;i++){        for(j=0;j<=N;j++){  //初始化图的为无限大            if(i!=j){                Graph[i][j] = INFI;            }else{                Graph[i][j]=0;            }        }    }    outMax =0;    for(i=1;i<=M;i++){        int x,y,len;        scanf("%d%d%d",&x,&y,&len);        if(len < Graph[x][y]){ //输入有重边            Graph[x][y] = len;            Graph[y][x] = len;           }    }    prim();    printf("%d\n",outMax);    return 0;}


 

0 0
原创粉丝点击