Prim算法,模版:
#include<iostream>
#include<stdio.h>
#include<string.h>
#define MAXN 105
#define inf 0x7f7f7f7f
bool vis[MAXN];
int mp[MAXN][MAXN],dis[MAXN],n;
int prim(int v)
{
int i,j,minn,k,sum=0;
for(i=1;i<=n;i++) dis[i]=mp[v][i];//以v节点初始化
vis[v]=1;//把v标记 记录到集合S1中
for(i=2;i<=n;i++)//寻找n-1次
{
minn=inf;
for(j=1;j<=n;j++)
if(dis[j]<minn&&!vis[j])//找到集合S2中最小的权值累加并把节点k并入到
{ //集合S1中
minn=dis[j];
k=j;
}
sum+=minn;
vis[k]=1;
for(j=1;j<=n;j++)//因为S1集合加入了节点k,所以要更新dis
//dis更新为已经找到的节点到集合S2中的距离(mp[k][j]),和原来S1集合
//(未加入K)时候到集合S2中的距离的较小值,这个值才是当前S1集合到S2集合
//中距离最小的点。
if(dis[j]>mp[k][j]&&!vis[j])
dis[j]=mp[k][j];
}
return sum;
}
int main()
{
int i,j,a,b,m;
while(scanf("%d",&n)!=EOF)
{
memset(vis,0,sizeof(vis));
memset(mp,inf,sizeof(mp));
printf("%d",mp[1][1]);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&mp[i][j]);
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
mp[a][b]=mp[b][a]=0;//已经建立的道路就把权值赋值为0,生成树的
} //值不影响最终结果
printf("%d\n",prim(1));
}
}