Prim算法(和最短路径DJ算法好像)优先试用于稠密图
 一开始n个点相互独立,如果要让n个点相互连通,那么让这n个点都依次进入树里面。
 从任意一点开始构造生成树,这里先从1点开始,让1点入树,book标记,dis标记到树的最短距离,然后遍历n个点,找到到树的最短距离,这个点入树,标记,然后更新dis数组,直到所有点都入树。
代码:
using namespace std;
int e[105][105], dis[105], book[105]={0};
int inf=99999999;
int n, m, i, j, k;
 
int main()
{
  int count=0, sum=0;
  scanf("%d%d", &n, &m);
  for (i=1; i<=n; i++)//先对图进行处理,可到达0,不可到达inf 
    for (j=1; j<=m; j++)
      if (i==j) e[i][j]=0;
      else  e[i][j]=inf;
  
  for (i=1; i<=m; i++){
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    e[u][v]=w;//无向图 
    e[v][u]=w;
  }
  
  for (j=1; j<=n; j++)//先让1点进树 
    dis[j]=e[1][j];
  
  book[1]=1;
  count++;
  while (count<n){//当n个点全jin树后完成 
    int min=inf;
    for (i=1; i<=n; i++){//找距离树的最短的点 
      if (book[i]==0 && dis[i]<min){
        min=dis[i];
        j=i;
      }
    }
    book[j]=1;
    count++;
    sum+=dis[j];
    
    for (k=1; k<=n; k++){//更新dis 
      if (book[k]==0 && dis[k]>e[j][k])
        dis[k]=e[j][k];
    }
  }
  printf("%d", sum);//sum为这棵树边权之和 
  return 0;
}                
                










