前言
人在美国 , 刚下飞机, 还没睡醒 搁着看了半天题意没看懂什么意思(尤其是这个对称数组 (小声bb))
思路
按照题目直接跑一遍 最小生成树
emm 还真过了
code:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n,p[N];
int idx;
struct Edge
{
int a,b,w;
bool operator<(const Edge &W)const
{
return w <W .w;
}
}edges[N*2];
int find(int x)
{
if(x!=p[x])
return p[x] = find(p[x]);
return p[x];
}
int krusal()
{
sort(edges+1,edges+idx+1);
int res =0 , cnt = 0;
for(int i = 1;i<=N; i ++)
p[i] = i;
for(int i =1;i<=idx;i++)
{
int a = edges[i].a , b= edges[i].b , w= edges[i].w;
a= find(a);
b=find(b);
if(a!=b)
{
p[a] = b;
res+=w;
cnt++;
}
}
cout<<res<<endl;
}
void solve()
{
cin>>n;
int x;
for(int i = 1;i<=n;i++)
{
bool flag = true;
for(int j =1; j<=n; j++)
{
cin>>x;
if(x == 0)
flag = false;
if(!flag)
{
edges[++idx] ={i,j,x};
}
}
}
krusal();
}
int main()
{
solve();
return 0 ;
}