prim算法

来源:互联网 发布:js中修改class 编辑:程序博客网 时间:2024/06/07 11:16

prim算法:

第一步:先任意选择一个点作为  最小生成树 的起始点。

第二步:然后找出所有点中 到 最小生成树 的最小距离的点。又加入最小生成树

第三步:然后再更新 所有点 到最小生成树的 距离。

再重复第二三步。一直到n个点都被加入进来了。

例题:hdu 1102

#include<iostream> #include<cstdio> using namespace std; #define INF 0x1f1f1f1f//定义一个整数常量,表示无穷大 //prim函数返回得到的最小生成树的n-1条边的权值和 //参数cost 为表示图的矩阵,n为顶点个数 int prim(int cost[][200],int n) {     //low表示每个点到生成树的最小距离,vis表示一个点是否已加入生成树中     int low[10000],vis[10000]={0};     int i,j,p;     int min,res=0;     vis[0]=1;     for(i=1;i<n;i++)low[i]=cost[0][i];     for(i=1;i<n;i++)     {         min=INF;p=-1;         for(j=0;j<n;j++)         {             if(0==vis[j]&&min>low[j])             {                 min=low[j];                 p=j;             }         }         //min==INF说明找不到能够加入的点了,说明图是不连通的         if(min==INF)return -1;          res+=min;         vis[p]=1; for(j=0;j<n;j++)         {             if(0==vis[j]&&low[j]>cost[p][j])             {                 low[j]=cost[p][j];             }         }     }     return res; }  int main() {     int n;     int a[200][200]; while(cin>>n)     {         for(int i=0;i<n;i++)         {             for(int j=0;j<n;j++)             {                 scanf("%d",&a[i][j]);             }         }         int q;         scanf("%d",&q);         for(int i=0;i<q;i++)         {             int u,v;             scanf("%d%d",&u,&v);             a[u-1][v-1]=a[v-1][u-1]=0;         }         int res=prim(a,n);         printf("%d\n",res);     }     return 0; } 


原创粉丝点击