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;
}