最小全域木-----------連絡

Tyvjは1歳で、最初の数人のユーザーから数万人のユーザーに増え、TyvjのWebサイトは徐々に成長しており、管理者の数も増えています。管理者が相互に(直接または間接的に)連絡できるように、いくつかの通信チャネルを見つけてください。この質問に関係する通信チャネルは双方向です。Tyvjは過度の利益のない非営利のウェブサイトなので、コストをできるだけ低く抑える必要があります。現在、Tyvjの通信チャネルは2つのカテゴリに分かれています。1つは必須の通信チャネルであり、価格がいくらであっても、すべてを選択する必要があります。もう1つは、選択可能な通信チャネルです。最終管理者として連絡する通信チャネルをいくつか選択します。データは、特定の通信チャネルがすべての管理者が通信できることを保証します。注:一部の2人の管理者に対して、u、vu、v

、それらの間に複数の通信チャネルがある場合があります。プログラムはすべてのu、vu、vを蓄積する必要があります

チャネル間を通過する必要があります。入力フォーマットの最初の行の2つの整数n、mn、m

Tyvjが合計nnであることを示します

管理者、mm

通信チャネル; 2行目からm + 1m + 1

行、行ごとに4つの負でない整数、p、u、v、wp、u、v、w

p = 1p = 1の場合

、この通信チャネルが必須の通信チャネルであることを示します(p = 2p = 2の場合)

、この通信チャネルが選択的通信チャネルであることを示します; u、v、wu、v、w

このメッセージがu、vu、vについて説明していることを示します

管理者間の通信チャネル、uu

vvを受け取ることができます

情報、vv

uuも受け取ることができます

情報、ww

コストを示します。出力形式は、最小通信コストを表す整数です。データ範囲1≤n≤20001≤n≤2000

1≤m≤100001≤m≤10000

サンプル入力:5 6
1 1 2 1
1 2 3 1
1 3 4 1
1 4 1 1
2 2 5 10
2 2 5 5
サンプル出力:9

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 2010, M = 10010;
int n, m;
int p[N];
struct Edge{
 int a, b, w;
 bool operator < (const Edge &t)const{
     return w < t.w; 
 }
}e[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;
  int res = 0, k = 0;
 for (int i = 0; i < m; i ++){
  int t, a, b, w;
  cin >> t >> a >> b >> w;
  if (t == 1){
   res  += w;
   p[find(a)] = find(b);
  }
  else    e[k ++] = {a, b, w};
 }
  sort(e, e + k);
  for (int i = 0; i < k; i ++){
  int a = find(e[i].a), b = find(e[i].b);
  if (a != b){
   res += e[i].w;
   p[a] = b;
  }
 }
  cout << res << endl;
  return 0;
}

公開された164のオリジナル記事 いいね112 訪問6777

おすすめ

転載: blog.csdn.net/qq_45772483/article/details/105408792