Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Nguyen Huu Hoang Minh
- #include <bits/stdc++.h>
- #define sz(x) int(x.size())
- #define all(x) x.begin(),x.end()
- #define reset(x) memset(x, 0,sizeof(x))
- #define pb push_back
- #define mp make_pair
- #define fi first
- #define se second
- #define N 50005
- #define remain(x) if (x > MOD) x -= MOD
- #define ii pair<int, int>
- #define iiii pair< ii , ii >
- #define viiii vector< iiii >
- #define vi vector<int>
- #define vii vector< ii >
- #define bit(x, i) (((x) >> (i)) & 1)
- #define Task "test"
- #define int long long
- using namespace std;
- typedef long double ld;
- const int inf = 1e9*5e6;
- const int minf = -1e9*5e6;
- int n, m;
- struct edges{
- int u, v, w;
- //edges(int uu, int vv, int ww) {u = uu; v = vv; w = ww;}
- bool operator < (edges& e){
- return e.w > w;
- }
- };
- edges e[500005];
- vector<ii> g[50005];
- int f[50005][20];
- int cha[50005][20];
- int d[50005];
- void readfile()
- {
- ios_base::sync_with_stdio(false);
- cin.tie(0);cout.tie(0);
- if (fopen(Task".inp","r"))
- {
- freopen(Task".inp","r",stdin);
- //freopen(Task".out","w",stdout);
- }
- cin >> n >> m;
- for(int i=1; i<=m; i++){
- cin >> e[i].u >> e[i].v >> e[i].w;
- }
- sort(e+1,e+1+m);
- //for(int i=1; i<=m; i++) cout << e[i].w << endl;
- }
- vector<int> id_of_1st_mst;
- vector<int> id_of_2nd_mst;
- int par[N];
- int get(int u){
- return (u == par[u] ? u : par[u] = get(par[u]));
- }
- void join(int u, int v){
- par[v] = u;
- }
- void dfs(int u, int pre){
- for(int i=1; i<20; i++)
- {
- cha[u][i] = cha[cha[u][i-1]][i-1];
- f[u][i] = max(f[u][i-1],f[cha[u][i-1]][i-1]);
- }
- for(auto i : g[u]){
- int v = i.fi;
- int uv = i.se;
- if (v==pre) continue;
- if (v!=pre){
- f[v][0] = uv;
- cha[v][0] = u;
- d[v] = d[u] + 1;
- dfs(v,u);
- }
- };
- }
- int lca(int u, int v){
- if (d[u] < d[v]) swap(u,v);
- int delta = d[u] - d[v];
- for(int i=19; i>=0; i--){
- if (bit(delta,i)) u = cha[u][i];
- }
- if (u==v) return u;
- for(int i=19; i>=0; i--){
- if (cha[u][i]!=cha[v][i]){
- u=cha[u][i];
- v=cha[v][i];
- }
- }
- return cha[u][0];
- }
- int calc(int u, int v){
- int z = lca(u,v);
- int res = minf;
- int delta = d[u] - d[z];
- if (delta!=0) for(int i=19; i>=0; i--){
- if (bit(delta,i)){
- res = max(res,f[u][i]);
- u=cha[u][i];
- }
- }
- delta = d[v] - d[z];
- if (delta!=0) for(int i=19; i>=0; i--){
- if (bit(delta,i)){
- res = max(res,f[v][i]);
- v = cha[v][i];
- }
- }
- return res;
- }
- void proc()
- {
- int ans1=0;
- for(int i=1; i<=n; i++) par[i] = i;
- for(int i=1; i<=m; i++){
- int u = e[i].u; int preu = u;
- int v = e[i].v; int prev = v;
- int w = e[i].w;
- if (get(u)!=get(v)){
- u = get(u);
- v = get(v);
- id_of_1st_mst.pb(i);
- //cout << preu << ' ' << prev << ' ' << w << endl;
- join(u,v);
- ans1+=w;
- }
- else id_of_2nd_mst.pb(i);
- }
- cout << ans1 << '\n';
- for(auto i : id_of_1st_mst){
- int u = e[i].u; int v = e[i].v;
- g[u].pb(ii(v,e[i].w));
- g[v].pb(ii(u,e[i].w));
- }
- dfs(1,1);
- int tmp = inf;
- for(auto j : id_of_2nd_mst){
- int u = e[j].u;
- int v = e[j].v;
- //cout << u << ' ' << v << ' ' << e[j].w << endl;
- //cout << calc(u,v) << endl;
- tmp = min(tmp,e[j].w-calc(u,v));
- }
- cout << ans1 + tmp;
- }
- signed main()
- {
- readfile();
- proc();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement