ローカルエリアネットワークにnnがあります
コンピューターとkk
双方向ネットワークケーブル、コンピューター番号は1〜n1〜n
。ローカルエリアネットワークを設定する際のスタッフの過失により、ローカルエリアネットワークの接続はループを形成します。ローカルエリアネットワークがループを形成すると、データがループ内で連続的に送信され、ネットワークカードの現象が発生することがわかっています。注:接続の場合、双方向ですが、ループとは見なしません。この質問で説明されている回路には、少なくとも2つの異なる接続が含まれている必要があります。2つのコンピューター間で最大1つの接続が可能です。接続は1つではなく、接続の両端は同じコンピューターです。コンピュータを接続するネットワークケーブルが異なるため、接続の一部はあまりスムーズではないため、f(i、j)f(i、j)を使用します
表示 i,ji,j
f(i、j)f(i、j)間の接続の滑らかさ
値が小さいほど、i、ji、j
接続がスムーズになります。次に、ループ問題を解決する必要があります。接続をいくつか削除します。これにより、ネットワークにループがなくなり、接続性に影響が及ばないようになります(つまり、2つのポイントが以前に接続されている場合は、接続後に接続する必要があります)。ネットワークケーブルは削除されます。 Σf(i、j)Σf(i、j)
最大、この最大値を要求します。入力形式の最初の行にある2つの正の整数n、kn、k
。次のKK
3つの正の整数i、j、mi、j、m
表示 i,ji,j
2台のコンピューター間にネットワークケーブル接続があり、滑らかさはmm
。出力形式は正の整数で、Σf(i、j)を表します。Σf(i、j)からネットワークケーブルが削除されます。
最大値。データ範囲1≤n≤1001≤n≤100
0≤k≤2000≤k≤200
1≤f(i、j)≤10001≤f(i、j)≤1000
サンプル入力:5 5
1 2 8
1 3 1
1 5 3
2 4 5
3 4 2
サンプル出力:8
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110, M = 210;
struct Edge{
int a, b, w;
bool operator <(const Edge &t)const{
return w < t.w;
}
}e[M];
int p[N];
int n, m;
int find(int x){
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int main(){
cin >> n >> m;
for (int i = 1; i <= n; i ++) p[i] = i;
for (int i = 0; i < m; i ++){
int a, b, c;
cin >> a >> b >> c;
e[i] = {a, b, c};
}
sort(e, e + m);
int res = 0;
for (int i = 0; i < m; i ++){
int a = find(e[i].a), b = find(e[i].b), w = e[i].w;
if (a != b) p[a] = b;
else res += w;
}
cout << res << endl;
return 0;
}