#include<bits/stdc++.h>
using namespace std;
const int N = 500,INF = 0x3f3f3f3f;
int n,ans,minn;
int c[N],w[N][N],dis[N],vis[N];
void read(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&w[0][i]),w[i][0] = w[0][i];
for(int i=1;i <= n;i++)
for(int j=1;j <= n;j++)
scanf("%d",&w[i][j]);
}
void prim(){//堆优化的prim
for(int i=1;i<=n;i++) dis[i] = INF;
priority_queue<pair<int,int> > q;
dis[0] = 0;
q.push(make_pair(0,0));
int cnt = 0,ans=0;
while(q.size() && cnt <=n){
int d = -q.top().first,u=q.top().second;
q.pop();
if(vis[u]) continue;
cnt++;
ans += d;
vis[u] = 1;
for(int i=1;i<=n;i++){
if(w[u][i] < dis[i]){
dis[i] = w[u][i];
q.push(make_pair(-dis[i],i));
}
}
}
printf("%d",ans);
}
/*void prim(){
for(int i=0;i<=n;i++) dis[i] = INF;
dis[0] = 0,ans = 0;
int k;
for(int i=0;i<=n;i++){
minn = INF;
for(int j = 0;j<=n;j++)
if(!vis[j] && minn > dis[j]) minn = dis[j],k=j;
vis[k] = 1;
ans += dis[k];
for(int j=0;j<=n;j++)
if(!vis[j] && dis[j] > w[k][j]) dis[j] = w[k][j];
}
printf("%d",ans);
}*/
int main(){
read();
prim();
return 0;
}
一本通1488:新的开始
最新推荐文章于 2024-06-13 21:19:08 发布