莫欺少年穷,修魔之旅在这开始—>算法提高课题解
思路:
- 建立超级源点,从超级源点出发向所有矿井连一条边,最后在做一下prim算法
可参考: Prim算法求最小生成树
#include<bits/stdc++.h>
using namespace std;
const int N = 310;
int n;
int w[N][N];
int dist[N];
bool st[N];
//基本操作
int prim()
{
memset(dist,0x3f,sizeof dist);
dist[0]=0;
int res=0;
for(int i=0;i<=n;i++)
{
int t=-1;
for(int j=0;j<=n;j++)
if(!st[j]&&(t==-1||dist[t]>dist[j]))
t=j;
st[t]=true;
res+=dist[t];
for(int j=0;j<=n;j++) dist[j]=min(dist[j],w[t][j]);
}
return res;
}
int main()
{
cin>>n;
//输入超级源点
for(int i=1;i<=n;i++) cin>>w[i][0],w[0][i]=w[i][0];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>w[i][j];
cout<<prim()<<endl;
return 0;
}