prim(n^2)求图中最小距离(最小生成树)

来源:互联网 发布:淘宝导航条颜色表 编辑:程序博客网 时间:2024/06/03 15:53
#include<iostream>const int maxn=1001,inf=1000000000;using namespace std;int a[maxn][maxn],d[maxn],p[maxn];int main(){int i,j,k,m,n;scanf("%d%d",&n,&m);//共n个点m条边 求走遍所有点的最小路径 for(i=1;i<=m;i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);a[x][y]=a[y][x]=z;}for(i=1;i<=n;i++)d[i]=inf;d[1]=0;int ans=0;for(i=1;i<=n;i++){int zx=inf;for(j=1;j<=n;j++)//找到离原点(注意是原点)最近的没有走过的点 使更新次数尽量少if(!p[j] && d[j]<zx){zx=d[j];k=j;}p[k]=1;ans+=d[k];//prim与dijkstra不一样的地方 for(j=1;j<=n;j++)if(!p[j] && a[k][j]!=0 && d[j]>a[k][j])d[j]=a[k][j];//prim的d数组存的到该点的最后一条边的长度 dijkstra存的是原点到该点的路径总长 }printf("%d",ans);return 0;}
prim是从某点开始每次走到离此点最近的点



简单说一下prim与dijkstra的区别:

prim(貌似跟最小生成树是一样的吧)求的是图内保证所有点联通的最短路径和

dijkstra求的是图内某点到所有点的最短路径

所以数组存的也不一样 prim的数组存的的只是一条边的长度 dijkstra存的是多条边的长度和(目标点到原点的最短路)

本人刚入门  如有错误请见谅

0 0
原创粉丝点击