結果
| 問題 |
No.2200 Weird Shortest Path
|
| ユーザー |
|
| 提出日時 | 2023-03-23 00:44:20 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 79 ms / 2,000 ms |
| コード長 | 1,195 bytes |
| コンパイル時間 | 1,790 ms |
| コンパイル使用メモリ | 173,296 KB |
| 実行使用メモリ | 12,388 KB |
| 最終ジャッジ日時 | 2024-09-18 15:08:22 |
| 合計ジャッジ時間 | 5,342 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 44 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N=2e5+10;
int n,m;
int f[N];
struct P{
int a,b,c;
bool operator<(const P&x){
return c<x.c;
}
}g[N];
struct DSU{
int f[N];//祖先
int S[N];//大小
void init(int n){
for(int i=1;i<=n;i++) f[i]=i,S[i]=1;
}
inline int find(int x){
return (x==f[x])?x:f[x]=find(f[x]);
}
inline int size(int a){
return S[find(a)];
}
bool same(int a,int b){
return find(a)==find(b);
}
void merge(int a,int b){//a合并到b上
a=find(a),b=find(b);
if(a==b) return ;
if(S[a]>S[b]) swap(a,b);
S[b]+=S[a];
f[a]=b;
}
}dsu;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
//freopen("in.txt","r",stdin);
cin>>n>>m;
dsu.init(n);
for(int i=0;i<m;i++){
int a,b,c; cin>>a>>b>>c;
g[i]={a,b,c};
}
sort(g,g+m);
int ans=0;
for(int i=0;i<m;i++){
int a=g[i].a,b=g[i].b,c=g[i].c;
if(dsu.same(a,b)) continue;
ans+=dsu.size(a)*dsu.size(b)*c;
dsu.merge(a,b);
}
cout<<ans;
return 0;
}