1. 程式人生 > >poj 1258 Agri-Net 最小生成樹模板

poj 1258 Agri-Net 最小生成樹模板

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MAXV 501
#define INF 999999999
  /*
  prim演算法:從第一個點出發,尋找最近的距離
  每一次都尋找離這個堆最近距離的點,尋找到
  最後一個點。

  */
int n;
int map[MAXV][MAXV];
int d[MAXV];
bool vis[MAXV];
  void prim()
  {

      int i,j,v,tmp;
      for(i=0;i<n;i++)//第一個點距離所有點的距離
      {
          vis[i]=0;
          d[i]=map[0][i];
      }
      vis[0]=1;
      for(i=1;i<n;i++)
    {
          tmp=INF;
          for(j=0;j<n;j++)//找出距離最小的一個點出來
          {
              if(!vis[j]&&tmp>d[j])
              {
                  tmp=d[j];
                  v=j;
              }
          }
          vis[v]=1;
          for(j=0;j<n;j++)//進行距離的調整,可能對加入的點距離更近
          {
              if(!vis[j]&&d[j]>map[v][j])
          {
              d[j]=map[v][j];
          }
          }}

          for(d[0]=0,i=1;i<n;i++)d[0]+=d[i];
          printf("%d\n",d[0]);

  }
int main(){
    int i,j,t;

        while(~scanf("%d",&n))
        {for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
               scanf("%d",&map[i][j]);
            }
        }
         prim();}


    return 0;
}