锻炼一下最小生成树(kruskal)
#include <iostream>
#include <vector>
#include <algorithm>
#define maxn 120
using namespace std;
struct Edge
{
int u,v,w;
Edge(int a,int b,int c):u(a),v(b),w(c) {}
Edge() {}
bool operator < (const Edge & b) const
{
return w<b.w;
}
};
vector<Edge>edges;
int p[maxn];
int Find(int x)
{
return p[x]==x?x:Find(p[x]);
}
int main()
{
int n,t;
int re = 0;
long long ans = 0;
while(cin>>n)
{
edges.clear();
ans = 0;
re = 0;
for(int i = 0; i<n; i++)
{
for(int j = 0; j<n; j++)
{
cin>>t;
if(t)
{
edges.push_back(Edge(i,j,t));
}
}
}
//sort
sort(edges.begin(),edges.end());
for(int i = 0; i<n; i++)
{
p[i] = i;
}
for(int i = 0; i<edges.size(); i++)
{
int x = Find(edges[i].u);
int y = Find(edges[i].v);
if(x!=y)
{
ans += edges[i].w;
re++;
p[x] = y;
}
}
if(re!=n-1)
{
cout<<-1<<endl;
}
else
{
cout<<ans<<endl;
}
}
return 0;
}
/**
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
**/