Untitled
unknown
plain_text
a year ago
1.5 kB
8
Indexable
int n, m;
struct edge
{
int u, v, cost;
bool operator<(const edge &other) const
{
return cost < other.cost;
}
};
vii parent;
void make_set(int u)
{
parent[u] = u;
}
int find_set(int v)
{
return v == parent[v] ? v : parent[v] = find_set(parent[v]);
}
void union_set(int u, int v)
{
u = find_set(u);
v = find_set(v);
if(u == v) return;
parent[u] = v;
}
pair<int, vii> kruskal(int n, vector<edge> &e, sii &ex)
{
parent.assign(n + 1, 0);
FORD(i, 1, n)
{
make_set(i);
}
int total = 0, e_cnt = 0;
vii mst;
FOR(i, 0, e.size())
{
if(ex.count(i)) continue;
if(find_set(e[i].u) != find_set(e[i].v))
{
union_set(e[i].u, e[i].v);
total += e[i].cost;
mst.pb(i);
++e_cnt;
}
}
return (e_cnt == n - 1) ? make_pair(total, mst) : make_pair(INT_MAX, vii());
}
void nhap()
{
cin >> n >> m;
}
void solve()
{
nhap();
vector<edge> e(m);
FOR(i, 0, m)
{
cin >> e[i].u >> e[i].v >> e[i].cost;
}
sort(all(e));
sii ex;
pair<int, vii> res = kruskal(n, e, ex);
int s1 = res.fi;
vii mst = res.se;
int s2 = INT_MAX;
for(int i : mst)
{
ex.clear();
ex.insert(i);
int cost = kruskal(n, e, ex).fi;
if(cost != INT_MAX)
{
s2 = min(s2, cost);
}
}
cout << s1 << " " << s2;
}Editor is loading...
Leave a Comment