没设虚拟节点,直接把优惠和a的min当成边,然后再加上第一个点的a1
#include<bits/stdc++.h>
using namespace std;
const int maxn=1010*1010;
int pre[1010];
struct node{
int a,b,w;
bool operator <(const node &a)const
{
return w<a.w;
}
}g[maxn];
int find(int a)
{
if(pre[a]==a)
return pre[a];
else
return pre[a]=find(pre[a]);
}
int main()
{
int a1,b1;
cin>>a1>>b1;
int cnt=1;
for(int i=1;i<=a1;i++)pre[i]=i;
for(int i=1;i<=b1;i++)
{
for(int j=1;j<=b1;j++)
{int w;
if(j>i) break;
cin>>w;
g[cnt++].a=i;
g[cnt].b=j;
if(w==0)
g[cnt].w=a1;
else
g[cnt].w=w;
}
}
int ans=a1;//第一个点的价格
sort(g+1,g+1+cnt);
for(int i=1;i<=cnt;i++)
{
int x=g[i].a;
int y=g[i].b;
if(find(x)!=find(y))
{
pre[find(x)]=find(y);
ans+=g[i].w;
}
}
cout<<ans<<endl;
}