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;
}