Advertisement
Guest User

Untitled

a guest
Jun 30th, 2016
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.00 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define REP(i, n) for(auto i = 0; i < n; i++)
  3. using namespace std;
  4.  
  5. auto solve(int n, vector<int>& p, vector<vector<bool>>& g) -> void {
  6. vector<bool> used;
  7. function<bool(int, int)> dfs = [&](int cur, int th) {
  8. if(p[cur] <= th) {p[cur]++; return true;}
  9. used[cur] = true;
  10. REP(prev, n) {
  11. if(!used[prev] && g[prev][cur] && dfs(prev, th)) {
  12. swap(g[prev][cur], g[cur][prev]);
  13. return true;
  14. }
  15. }
  16. return false;
  17. };
  18. while(true) {
  19. auto max_i = distance(p.begin(), max_element(p.begin(), p.end()));
  20. used.assign(n, false);
  21. if(!dfs(max_i, p[max_i] - 2)) break;
  22. p[max_i]--;
  23. }
  24. }
  25.  
  26. auto main() -> int {
  27. int n, m, ui, vi;
  28. while(cin >> n >> m, n || m) {
  29. vector<int> p(n, 0);
  30. vector<vector<bool>> g(n, vector<bool>(n, false));
  31. REP(i, m) cin >> ui >> vi, g[ui - 1][vi - 1] = true, p[vi - 1]++;
  32. solve(n, p, g);
  33. auto ans = minmax_element(p.begin(), p.end());
  34. cout << *ans.first << ' ' << *ans.second << endl;
  35. }
  36. return 0;
  37. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement