Kaidul

10600

Jun 19th, 2013
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.61 KB | None | 0 0
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<cctype>
  5. #include<cmath>
  6. #include<iostream>
  7. #include<utility>
  8. #include<fstream>
  9. #include<numeric>
  10. #include<string>
  11. #include<vector>
  12. #include<queue>
  13. #include<map>
  14. #include<algorithm>
  15. #include<set>
  16. #include<sstream>
  17. #include<stack>
  18. #include<list>
  19. #include<iterator>
  20. #include <bitset>
  21. using namespace std;
  22.  
  23. #define REP(i,n) for(__typeof(n) i=0; i<(n); i++)
  24. #define FOR(i,a,b) for(__typeof(b) i=(a); i<=(b); i++)
  25. #define CLEAR(t) memset((t), 0, sizeof(t))
  26. typedef long long int64;
  27. typedef long double d64;
  28. #define READ(f) freopen(f, "r", stdin)
  29. #define WRITE(f) freopen(f, "w", stdout)
  30. #define PI acos(-1.0)
  31. #define INF (1<<30)
  32. #define eps 1e-8
  33. #define pb push_back
  34. #define ppb pop_back
  35. #define bg begin
  36. #define pii pair<double,double>
  37. #define G struct node
  38.  
  39. vector < int > pset(1000);
  40. void initSet(int _size) {
  41.     pset.resize(_size);
  42.     FOR(i,0,_size-1) pset[i]=i;
  43. }
  44. int findSet(int i) {
  45.     return (pset[i]== i)?i: (pset[i] = findSet(pset[i]));
  46. }
  47. void unionSet(int i,int j) {
  48.     pset[findSet(i)]=findSet(j);
  49. }
  50. bool isSameSet(int i,int j) {
  51.     return findSet(i)==findSet(j);
  52. }
  53.  
  54. G {
  55.     int u, v;
  56.     double cost;
  57.     bool operator <(const G& a) const{
  58.         return cost < a.cost;
  59.     }
  60. } g[220];
  61.  
  62. int n, e;
  63. vector< int > data;
  64.  
  65. int BMST2(int p) {
  66.     initSet(n + 3);
  67.     int mstlen = 0;
  68.     int sum2 = 0;
  69.     for(int i = 0; i < e; i++) {
  70.         if(i == p)
  71.             continue;
  72.         else if(!isSameSet(g[i].u, g[i].v)) {
  73.             mstlen++;
  74.             sum2 += g[i].cost;
  75.             unionSet(g[i].u, g[i].v);
  76.         }
  77.     }
  78.     if(mstlen < n-1) return -1;
  79.     return sum2;
  80. }
  81.  
  82. int main() {
  83.     READ("input.txt");
  84.     int cas;
  85.     scanf("%d", &cas);
  86.     while(cas--) {
  87.         scanf("%d %d", &n, &e);
  88.         REP(i, e) {
  89.             int x, y, cost;
  90.             scanf("%d %d %d", &x, &y, &cost);
  91.             g[i].u = x, g[i].v = y, g[i].cost = cost;
  92.         }
  93.  
  94.         initSet(n + 3);
  95.  
  96.         sort(g, g + e);
  97.  
  98.         int sum = 0;
  99.         for(int i = 0; i < e; i++) {
  100.             if(!isSameSet(g[i].u, g[i].v)) {
  101.                 data.pb(i), sum += g[i].cost;
  102.                 unionSet(g[i].u, g[i].v);
  103.             }
  104.         }
  105.  
  106.         if(e == 1) {
  107.             printf("%d %d\n", sum, sum);
  108.         } else {
  109.             int in, best = INF, indx = 0;
  110.             REP(i, data.size()) {
  111.                 indx = data[i], in = BMST2(indx);
  112.                 if(in < best) best = in;
  113.             }
  114.             printf("%d %d\n", sum, best);
  115.         }
  116.         data.clear();
  117.     }
  118.     return 0;
  119. }
Advertisement
Add Comment
Please, Sign In to add comment