jw910731

SBMST

Nov 7th, 2019
206
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.00 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #ifdef TEST
  3.     #define debug(...) printf(__VA_ARGS__)
  4. #else
  5.     #define debug(...) (void)0
  6. #endif
  7. #define EB emplace_back
  8. #define MP make_pair
  9. #define ST first
  10. #define ND second
  11. using namespace std;
  12. using ll = long long;
  13. using llu = long long unsigned;
  14. using pii = pair<int,int>;
  15. /************************/
  16. #define MAX 100
  17. using Edge = tuple<int, int, int>; // Edge represented by (w, a, b)
  18. using Mst = pair<vector<int>, int>; // contain point set & size
  19. int n, m;
  20. struct disjoint{
  21.     int arr[MAX+5];
  22.     disjoint(){
  23.         for(int i = 0 ; i < MAX+5; ++i)
  24.             arr[i] = i;
  25.     }
  26.     int find(int n){return arr[n] = (arr[n] == n)?n:find(arr[n]);}
  27.     void Union(int a, int b){arr[find(b)] = find(a);}
  28. };
  29. Mst kruskal(vector<Edge> &g, int ignore=-1){
  30.     vector<int> s;
  31.     int sum = 0;
  32.     disjoint dj;// core disjoint set
  33.     for(int i = 0 ; i < int(g.size()) ; ++i){
  34.         int a, b, w; // edge on a and b, weight = w
  35.         tie(w, a, b) = g[i];
  36.         // not in the same set
  37.         if(dj.find(a) != dj.find(b) && (ignore < 0 || ignore != i)){
  38.             s.EB(i);
  39.             sum += w;
  40.             dj.Union(a, b);  // union in the set
  41.         }
  42.     }
  43.     return (int(s.size()) >= n-1)? MP(s, sum): MP(s, numeric_limits<int>::max());
  44. }
  45. int sbmst(Mst &mst, vector<Edge> &graph){
  46.     int sbmst_sz = numeric_limits<int>::max();
  47.     for(auto it = mst.ST.begin(); it != mst.ST.end(); ++it){
  48.         Mst tmp = kruskal(graph, *it);
  49.         if(tmp.ND < sbmst_sz){
  50.             sbmst_sz = tmp.ND;
  51.         }
  52.     }
  53.     return sbmst_sz;
  54. }
  55. int main(){
  56.     int t;
  57.     scanf("%d", &t);
  58.     while(t--){
  59.         vector<Edge> graph;
  60.         scanf("%d%d", &n, &m);
  61.         for(int i = 0 ; i < m; ++i){
  62.             int a, b, w;
  63.             scanf("%d%d%d", &a, &b, &w);
  64.             graph.EB(w, a, b);
  65.         }
  66.         sort(graph.begin(), graph.end());
  67.         Mst mst = kruskal(graph);
  68.         int sbmst_sz = sbmst(mst, graph);
  69.         printf("%d %d\n", mst.ND, sbmst_sz);
  70.     }
  71.     return 0;
  72. }
Advertisement
Add Comment
Please, Sign In to add comment