最小スパニングツリー------------ LAN

ローカルエリアネットワークに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;
}
公開された元の記事164件 いいね112 訪問者6781

おすすめ

転載: blog.csdn.net/qq_45772483/article/details/105395180
おすすめ