Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define ll long long
- #define test int tt; cin>>tt; for(int cs=1;cs<=tt;cs++)
- vector<ll>parent,rankk;
- map<pair<ll,ll>,bool>x;
- vector<pair<ll,pair<ll,ll>>>edge;
- void make_set(ll n)
- {
- for(ll i=0; i<n; i++)
- {
- parent[i] = i;
- rankk[i] = 0;
- }
- }
- int find_set(ll v)
- {
- if (v == parent[v])
- {
- return v;
- }
- return parent[v] = find_set(parent[v]);
- }
- void union_sets(ll a, ll b)
- {
- a = find_set(a);
- b = find_set(b);
- if (a != b)
- {
- if(rand()%2)
- {
- swap(a,b);
- }
- parent[b]=a;
- /* else use this
- if (rankk[a] < rankk[b]){swap(a, b);} parent[b] = a; if (rankk[a] == rankk[b]){rankk[a]++;}
- */
- }
- }
- int main()
- {
- ios_base::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- test
- {
- ll n,m,i,j,k,l=1,c,d,e;
- cin>>n>>m;
- edge.clear();
- x.clear();
- parent.resize(n+2);
- rankk.resize(n+2);
- make_set(n+2);
- for(i=0; i<m; i++)
- {
- cin>>c>>d>>e;
- edge.push_back({e,{c,d}});
- }
- sort(edge.begin(),edge.end());
- l=0;
- k=INT_MAX;
- ///1st MST
- for(auto dd:edge)
- {
- if(find_set(dd.second.second)!=find_set(dd.second.first))
- {
- x[ {dd.second.first,dd.second.second}]=1;
- l+=dd.first;
- union_sets(dd.second.first,dd.second.second);
- }
- }
- ///2nd best MST
- for(auto dd:edge)
- {
- if(x[ {dd.second.first,dd.second.second}]==1)
- {
- d=0;
- e=1;
- make_set(n+2);
- for(auto ee:edge)
- {
- if(find_set(ee.second.second)!=find_set(ee.second.first) && dd!=ee)
- {
- d+=ee.first;
- e++;
- union_sets(ee.second.first,ee.second.second);
- }
- if(e>=n)
- {
- k=min(k,d);
- break;
- }
- }
- }
- }
- cout<<l<<" "<<k<<endl;
- }
- return 0;
- }
- /*
- for(i=0; i<m; i++)
- {
- if(x[ {edge[i].second.first,edge[i].second.second}]==1)
- {
- e=1;
- d=0;
- make_set(n+2);
- for(j=0; j<m; j++)
- {
- if(find_set(edge[j].second.second)!=find_set(edge[j].second.first) && i!=j)
- {
- d+=edge[j].first;
- e++;
- union_sets(edge[j].second.first,edge[j].second.second);
- }
- if(e>=n)
- {
- k=min(k,d);
- break;
- }
- }
- }
- }
- */
Advertisement
Add Comment
Please, Sign In to add comment