题意很明显,就是要求最小生成树,以前写过一个用kruskal的最小生成树,感觉那个比较好理解,基本就是在用并查集,而这个prim更像是是Dijkstra,跟那个只是查了一点而已。
#include<stdio.h>
#include<string.h>
#define inf 100000000
int mp[110][110],a[110];
bool used[110];
int n;
int solve()
{
int k,temp=inf,ans=0;
for(int i=1;i<=n;i++)
a[i]=mp[1][i];
used[1]=true;
for(int i=1;i<n;i++)
{
temp=inf;
for(int j=1;j<=n;j++)
{
if(a[j]<temp&&!used[j])
{
temp=a[j];
k=j;
}
}
used[k]=true;
// printf("%d\n",temp);
for(int j=1;j<=n;j++)
{
if(mp[k][j]<a[j])//这里就是跟dijkstra不同的地方!!
a[j]=mp[k][j];
}
ans+=temp;
}
return ans;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&mp[i][j]);
memset(used,false,sizeof(used));
printf("%d\n",solve());
}
return 0;
}