#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=1e3+10;
struct edge{
int u,v,w;
bool operator <(const edge &a)
{
return w<a.w;
}
};
int a,n;
vector<edge> q;
int fa[N];
int ans=0;
void init()
{
for(int i=1;i<=n;i++)
fa[i]=i;
}
int find(int x)
{
while(x!=fa[x]) x=fa[x];
return x;
}
void kruskal()
{
for(int i=0;i<q.size();i++)
{
int u=q[i].u;
int v=q[i].v;
int w=q[i].w;
u=find(u);
v=find(v);
if(u!=v)
{
fa[u]=v;
ans+=w;
}
}
}
int main()
{
cin>>a>>n;
init();
for(int u=1;u<=n;u++)
{
for(int v=1;v<=n;v++)
{
int w;
cin>>w;
if(!w&&u!=v)
w=a;
if(w>a)
w=a;
q.push_back({u,v,w});
}
}
sort(q.begin(),q.end());
kruskal();
cout<<ans+a;
return 0;
}
p1194 买礼物 kruskal(最小生成树)
于 2022-04-15 19:41:27 首次发布