一。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 999999999
int 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;
}