最小生成树 Prim算法
#include<iostream>
using namespace std;
#define max 101
#define MAX 10000000
int len[max][max];
int que[max];
int n;
int Prim()
{
int i,j;
int sum=0;
int lea[max];
int k;
int min;
for(i=1;i<=n;i++)
lea[i]=len[1][i];
que[1]=1;
for(i=2;i<=n;i++)
{
min=MAX;
for(j=2;j<=n;j++)
if(que[j]==0&&min>lea[j])
{
min=lea[j];
k=j;
}
que[k]=1;
sum+=min;
for(j=1;j<=n;j++)
if(que[j]==0&&len[k][j]<lea[j])
lea[j]=len[k][j];
}
return sum;
}
int main()
{
int i,j;
int x,y;
int k;
int m;
while(cin>>n!=0&&n)
{
for(i=1;i<=n;i++)
que[i]=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
len[i][j]=MAX;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cin>>m;
if(m<len[i][j])
len[i][j]=len[j][i]=m;;
}
}
cin>>m;
for(i=1;i<=m;i++)
{
cin>>x>>y;
len[x][y]=len[y][x]=0;
}
k=Prim();
cout<<k<<endl;
}
return 0;
}