Advertisement
PikMike

Untitled

Apr 10th, 2016
341
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.22 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define pb push_back
  4. #define mp make_pair
  5. #define sz size
  6. #define ll long long
  7. #define ld long double
  8. #define fs first
  9. #define sc second
  10. #define forn(i, f, t) for(int i = f; i < t; i++)
  11. #define all(x) (x).begin(), (x).end()
  12. #define ins insert
  13.  
  14. const int INF = 2147483647;
  15. const int MOD = 1000000007;
  16. const ll INF64 = 9223372036854775807;
  17. const ld EPS = 1e-7;
  18.  
  19. using namespace std;
  20.  
  21.  
  22. int findR(int v, vector<int>& p){
  23.     return (v == p[v] ? v : p[v] = findR(p[v], p));
  24. }
  25.  
  26.  
  27. void unionS(int v1, int v2, vector<int>& p){
  28.     p[findR(v2, p)] = findR(v1, p);
  29. }
  30.  
  31.  
  32. bool check(vector<vector<pair<int, int> > > d, int m){
  33.     int n = d.sz();
  34.     vector<vector<int> > g(n);
  35.     forn(i, 0, n)
  36.         forn(j, 0, d[i].sz())
  37.             if (d[i][j].sc > m)
  38.                 g[i].pb(d[i][j].fs);
  39.     vector<int> p, s(n, 0);
  40.     forn(i, 0, n)
  41.         p.pb(i);
  42.     forn(i, 0, n)
  43.         forn(j, 0, g[i].sz())
  44.             unionS(i, g[i][j], p);
  45.     // forn(i, 0, n) printf("%d ", p[i]); printf("\n");
  46.     forn(i, 0, n)
  47.         s[p[i]]++;
  48.     sort(all(s));
  49.     reverse(all(s));
  50.     int z;
  51.     for(z = 0; z < n; z++)
  52.         if (s[z] == 0) break;
  53.     s.resize(z);
  54.     vector<vector<int> > dp(s.sz());
  55.     forn(i, 0, s.sz())
  56.         forn(j, 0, n + 1)
  57.             dp[i].pb(0);
  58.     reverse(all(s));
  59.     // forn(i, 0, s.sz()) printf("%d ", s[i]); printf("\n");
  60.     forn(i, 1, s.sz())
  61.         forn(c, 0, n + 1)
  62.             dp[i][c] = (c < s[i] ? dp[i - 1][c] : max(dp[i - 1][c], dp[i - 1][c - s[i]] + s[i]));
  63.     // forn(i, 0, n + 1) printf("%d ", dp[s.sz() - 1][i]); printf("\n\n");
  64.     return dp[s.sz() - 1][n / 2] == n / 2;
  65. }
  66.  
  67.  
  68. int main(){
  69.     // freopen("network4.txt", "r", stdin);
  70.     freopen("tests.in", "r", stdin);
  71.     int n, m, f, t, w, l = INF, r = 0;
  72.     scanf("%d%d", &n, &m);
  73.     vector<vector<pair<int, int> > > d(n);
  74.     forn(i, 0, m){
  75.         scanf("%d%d%d", &f, &t, &w); --f; --t;
  76.         d[f].pb(mp(t, w));
  77.         d[t].pb(mp(f, w));
  78.         r = max(r, w);
  79.         l = min(l, w);
  80.     }
  81.     while (l < r - 1){
  82.         int m = (l + r) / 2;
  83.         if (check(d, m)) r = m;
  84.         else l = m;
  85.     }
  86.     printf("%d\n", check(d, l) ? l : r);
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement