POJ 1258

//最小生成树Prim算法
#include <iostream>
#include <string.h>
using namespace std;
#define arraysize 101
int maxData =  0x7fffffff;
int dis[arraysize][arraysize];
bool flag[arraysize];
int d[arraysize];
int N;
void prim()
{
 int sum = 0;
 memset(d,0,sizeof(d));
 memset(flag,0,sizeof(flag));
 int v=1;
 for(int i=1;i<N+1;++i)
 {
  d[i] = dis[v][i];
 }
 flag[v] = true;
 for(int i1=1;i1<N;++i1)
 {
  int min = maxData;
  for(int i3=2;i3<N+1;++i3)
  {
   if(!flag[i3] && min>d[i3])
   {
    min = d[i3];
    v = i3;
   }
  }
  flag[v] = true;
  sum += d[v];
  for(int i2=2;i2<N+1;++i2)
  {
   if(!flag[i2] && dis[v][i2]<d[i2]) //Prim算法与Dijkstra算法类似,仅有更新的时候有区别
    d[i2] = dis[v][i2];
  }
 }
 cout<<sum<<endl;
}
int main()
{
 //freopen("1.txt","r",stdin);
 while(cin>>N)
 {
  for(int i1=1;i1<N+1;++i1)
  {
   for(int i2=1;i2<N+1;++i2)
   {
    cin>>dis[i1][i2];    
   }    
  }
  prim();  //细节问题,切忌测试数据有多个,将prim算法放进去
 } 
 return 0;
}

你可能感兴趣的:(poj)