Submission
Status:
[PPPPPxSSSS]
Score: 0
User: SaccharomycesCerevisiae
Problemset: รัฐบาล
Language: cpp
Time: 0.002 second
Submitted On: 2025-04-16 22:16:49
#include<bits/stdc++.h>
#define pii pair<long long,pair<long long,long long>>
using namespace std;
priority_queue<pii,vector<pii>,greater<pii>>pq;
vector<pii>vec;long long sz[200],hv[200],disc[200],par[200],dep[200],head[200];long long timer = 0;
long long pa[200];long long mem[200];long long aa[200];long long n,m;
vector<pair<long long,long long>>adj[200];
struct SegmentTree{
long long t[200];
void build(long long l,long long r,long long i){
if(l==r){t[i]=aa[l];return;}
long long m = (l+r)/2;
build(l,m,i*2);
build(m+1,r,i*2+1);
t[i]=max(t[2*i],t[2*i+1]);
return;
}
long long query(long long l,long long r,long long i,long long x,long long y){
if(l>y||r<x)return LLONG_MIN;
if(l>=x&&r<=y){
return t[i];
}
long long m = (l+r)/2;
return max(query(l,m,i*2,x,y),query(m+1,r,i*2+1,x,y));
}
}f;
long long findpa(long long a){
if(a==pa[a])return a;
return pa[a]=findpa(pa[a]);
}
void dfs(long long u){
sz[u]=1;
for(auto [v,w]:adj[u]){
if(v==par[u])continue;
par[v]=u;
dep[v]=dep[u]+1;
dfs(v);
sz[u]+=sz[v];
if(sz[v]>sz[hv[u]]){mem[v]=w;hv[u]=v;}
}
return;
}
void hld(long long u,long long w){
disc[u]=++timer;
aa[timer]=w;
if(head[u]==0)head[u]=u;
if(hv[u]){
head[hv[u]]=head[u];
hld(hv[u],mem[hv[u]]);
}
for(auto [v,w]:adj[u]){
if(v==hv[u])continue;
if(v==par[u])continue;
hld(v,w);
}
return;
}
long long find_path(long long u,long long v){
vector<pair<long long,long long>>res;long long anss = 0;
while(head[u]!=head[v]){
if(dep[head[u]]<dep[head[v]])swap(u,v);
if(head[u]==u){
anss=max(anss,f.query(1,n,1,disc[head[u]],disc[u]));
}
else anss=max(anss,f.query(1,n,1,disc[head[u]]+1,disc[u]));
//cout<<head[u]<<" "<<u<<"\n";
u=par[head[u]];
}
if(dep[u]>dep[v])swap(u,v);
//cout<<u<<" "<<v<<"\n";
if(u==v)anss = max(anss,f.query(1,n,1,disc[u],disc[v]));
else anss = max(anss,f.query(1,n,1,disc[u]+1,disc[v]));
//cout<<"("<<anss<<")";
return anss;
}
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);//Bro made it n*m+m but I prefer n(logn)^2+m :>
cin>>n>>m;
for(long long i=0;i<n;i++){
pa[i+1]=i+1;
}
for(long long i=0;i<m;i++){
long long u,v,w;cin>>u>>v>>w;
pq.push({w,{u,v}});
}
long long ans = 0,ans2=LLONG_MAX;
while(!pq.empty()){
auto [w,uu]=pq.top();
pq.pop();
auto [u,v]=uu;
if(findpa(u)==findpa(v)){
vec.push_back({w,uu});continue;
}
pa[findpa(u)]=findpa(v);
adj[u].push_back({v,w});
adj[v].push_back({u,w});
ans+=w;
}
dfs(1);
hld(1,0);f.build(1,n,1);
for(auto [w,uu]:vec){
//cout<<"["<<uu.first<<" "<<uu.second<<"]\n";
long long aaa = find_path(uu.first,uu.second);
//cout<<"---------------\n";
ans2 = min(ans2,ans-aaa+w);
}
cout<<ans<<" "<<ans2;
return 0;
}