Advertisement
Guest User

Untitled

a guest
Oct 13th, 2015
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.14 KB | None | 0 0
  1. /*
  2.         By: facug91
  3.         From:
  4.         Name:
  5.         Date: 23/09/2015
  6. */
  7.  
  8. #include <bits/stdc++.h>
  9. #define y1      nd03dnqwuidg1odbnw9uddu0132d
  10. #define clock   asoudh219udhjdgausdhs9udy433
  11. #define left    dfgag34gsfaf342rf23fgwrf42ff
  12. #define middle  lk78k6ujkj76kjk88kkummnhh456
  13. #define right   apidwcojbl213f80sjb3y8efjfas
  14. #define move    df53y5fgsf43fdsfsdtg4j6hfdg4
  15. #define count   nkwdfj111afbjdfsbj32r8yfwejb
  16. #define prev    asdnklgbgbjfasdbhksdva4t9jds
  17. #define endl "\n"
  18. #define EPS 1e-9
  19. #define MP make_pair
  20. #define DB(x) cerr << " #" << (#x) << ": " << (x)
  21. #define DBL(x) cerr << " #" << (#x) << ": " << (x) << endl
  22. const double PI = 2.0*acos(0.0);
  23.  
  24. #define INF 1000000000
  25. //#define MOD 1000000007ll
  26. //#define MAXN 10005
  27.  
  28. using namespace std;
  29. typedef long long ll;
  30. typedef unsigned long long llu;
  31. typedef pair<int, int> ii; typedef pair<ii, ii> iiii;
  32. typedef vector<int> vi; typedef vector<ii> vii; typedef vector<iiii> viiii;
  33.  
  34. int n, q, a, b, s, t, p[405], pa[405], cnt;
  35. vector<pair<int, pair<int, int> > > adj[405], adj2[405];
  36. bool vis[405];
  37.  
  38. bool bfs () {
  39.     int u, v, c, rev, i;
  40.     queue<int> q; q.push(s);
  41.     for (i=1; i<=n; i++) p[i] = pa[i] = -1;
  42.     bool sink = false;
  43.     while (q.size()) {
  44.         u = q.front(); q.pop();
  45.         if (u == t) {
  46.             sink = true;
  47.             continue;
  48.         }
  49.         for (i=0; i<adj[u].size(); i++) {
  50.             v = adj[u][i].first;
  51.             c = adj[u][i].second.first;
  52.             rev = adj[u][i].second.second;
  53.             if (p[v] == -1 && c > 0) {
  54.                 p[v] = u;
  55.                 pa[v] = rev;
  56.                 q.push(v);
  57.             }
  58.         }
  59.     }
  60.     return sink;
  61. }
  62. int dfs (int u, int min_edge) {
  63.     if (u == s) return min_edge;
  64.     else if (p[u] != -1) {
  65.         int rev = adj[u][pa[u]].second.second;
  66.         int cr = adj[p[u]][rev].second.first;
  67.         if (cr > 0) {
  68.             int f = dfs(p[u], min(min_edge, cr));
  69.             if (f) {
  70.                 adj[p[u]][rev].second.first -= f;
  71.                 adj[u][pa[u]].second.first += f;
  72.             }
  73.             return f;
  74.         } else return 0;
  75.     } else return 0;
  76. }
  77.  
  78. int max_flow () {
  79.     int mf = 0, i, v, cr, rev;
  80.     while (bfs()) {
  81.         for (i=0; i<adj[t].size(); i++) {
  82.             v = adj[t][i].first;
  83.             rev = adj[t][i].second.second;
  84.             cr = adj[v][rev].second.first;
  85.             if (cr > 0) {
  86.                 p[t] = v;
  87.                 pa[t] = i;
  88.                 mf += dfs(t, cr);
  89.             }
  90.         }
  91.     }
  92.     return mf;
  93. }
  94.  
  95. void count_component (int u) {
  96.     vis[u] = true;
  97.     cnt++;
  98.     for (int i=0; i<adj[u].size(); i++) {
  99.         int v = adj[u][i].first;
  100.         if (!vis[v]) count_component(v);
  101.     }
  102. }
  103.  
  104. int main () {
  105.     ios_base::sync_with_stdio(0); cin.tie(0);
  106.     //cout<<fixed<<setprecision(7); cerr<<fixed<<setprecision(7); //cin.ignore(INT_MAX, ' '); //cout << setfill('0') << setw(5) << 25
  107.     int i, j, tc;
  108.    
  109.     cin>>n>>q;
  110.     while (q--) {
  111.         cin>>a>>b; a--;
  112.         adj[a].push_back(MP(b, MP(1, adj[b].size())));
  113.         adj[b].push_back(MP(a, MP(0, adj[a].size()-1)));
  114.         adj[a].push_back(MP(b, MP(0, adj[b].size())));
  115.         adj[b].push_back(MP(a, MP(1, adj[a].size()-1)));
  116.     }
  117.     memset(vis, 0, sizeof vis);
  118.     n++;
  119.     cnt = 0;
  120.     count_component(0);
  121.     if (cnt < n) {
  122.         cout<<0<<endl;
  123.         return 0;
  124.     }
  125.     for (i=0; i<n; i++) adj2[i] = adj[i];
  126.     int ans = INT_MAX;
  127.     for (i=1; i<n; i++) {
  128.         s = 0; t = i;
  129.         for (j=0; j<n; j++) adj[j] = adj2[j];
  130.         ans = min(ans, max_flow());
  131.     }
  132.     cout<<ans<<endl;
  133.    
  134.     return 0;
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement