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
- POJ2395 -- Prim算法
- POJ2395 最小生成树prim算法
- poj2395 Out of Hay (prim算法)
- poj2395 Kruskal题解(Prim好像过不了)
- poj2395
- POJ2395(最小生成树Kruskal算法)
- prim 算法
- Prim算法
- Prim算法
- prim算法
- Prim算法
- Prim算法。
- Prim 算法
- Prim算法
- prim算法
- Prim算法
- Prim算法
- Prim算法
- 关键字PASCAL
- 双缓存
- JSongTaste
- crash异常收集
- SAT数学练习题二
- POJ2395 -- Prim算法
- 查询最近oracle更改的数据 VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE
- 配置Android下OpenCV的native开发环境
- OPatch报错 Prerequisite check "CheckActiveFilesAndExecutables" failed
- MySQL修改root密码的4种方法
- Mysql 收集统计信息
- 查看mysql日志错误
- 网页获取各方面宽高
- C++第6,7,8章