Advertisement
Guest User

D

a guest
Jul 6th, 2015
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.55 KB | None | 0 0
  1. #include <algorithm>
  2. #include <bitset>
  3. #include <cmath>
  4. #include <cstdio>
  5. #include <cstring>
  6. #include <deque>
  7. #include <iomanip>
  8. #include <iostream>
  9. #include <queue>
  10. #include <map>
  11. #include <numeric>
  12. #include <set>
  13. #include <sstream>
  14. #include <stack>
  15. #include <utility>
  16. #include <vector>
  17.  
  18. #define INF 1000000000
  19. #define FOR(i, a, b) for(int i=int(a); i<int(b); i++)
  20. #define FORC(cont, it) for(typeof((cont).begin()) it = (cont).begin(); it != (cont).end(); it++)
  21. #define pb push_back
  22.  
  23. using namespace std;
  24.  
  25. typedef long long ll;
  26. typedef pair<int, int> ii;
  27. typedef vector<int> vi;
  28. typedef vector<ii> vii;
  29. typedef vector<vi> vvi;
  30.  
  31. #define maxN 100000
  32.  
  33. bool visited[maxN], cyc[maxN];
  34. int visitOrder[maxN];
  35. ii ed[maxN];
  36. vi edges[maxN];
  37.  
  38. bool findCycles(int n, int v) {
  39.     if (cyc[n]) {
  40.         if ((v - visitOrder[n]) & 1) {
  41.             return true;
  42.         }
  43.         return false;
  44.     }
  45.     if (visited[n]) return false;
  46.     visitOrder[n] = v;
  47.     cyc[n] = true;
  48.     visited[n] = true;
  49.     bool ret = false;
  50.     FOR(i, 0, edges[n].size()) {
  51.         int id = edges[n][i];
  52.         int next = ed[id].second;
  53.         if (ed[id].first != n) next = ed[id].first;
  54.         ret |= findCycles(next, v + 1);
  55.     }
  56.     cyc[n] = false;
  57.     return ret;
  58. }
  59.  
  60. ll sumN(ll n) {
  61.     return n*(n + 1) / 2;
  62. }
  63.  
  64. void sum(ii&l, ii r) {
  65.     l.first += r.first;
  66.     l.second += r.second;
  67. }
  68.  
  69. ii countRB(int n, bool red) {
  70.     ii ret = ii(0, 0);
  71.     if (visited[n]) return ret;
  72.     if (red) ret.first++;
  73.     else ret.second++;
  74.     visited[n] = true;
  75.     FOR(i, 0, edges[n].size()) {
  76.         int id = edges[n][i];
  77.         sum(ret, countRB(ed[id].first, !red));
  78.         sum(ret, countRB(ed[id].second, !red));
  79.     }
  80.     return ret;
  81. }
  82.  
  83. int main() {
  84.     ll n, m, a, b, minE, ways;
  85.     while (scanf("%I64d %I64d", &n, &m)!=EOF) {
  86.         bool vCount = false;
  87.         FOR(i, 0, n) edges[i].clear();
  88.         FOR(i, 0, m) {
  89.             scanf("%I64d %I64d", &a, &b);
  90.             a--, b--;
  91.             ed[i] = ii(a, b);
  92.             edges[a].push_back(i);
  93.             edges[b].push_back(i);
  94.         }
  95.         memset(visited, false, sizeof(visited));
  96.         bool cycFound = false;
  97.         FOR(i, 0, n) {
  98.             cycFound |= findCycles(i, 0);
  99.             if (edges[i].size() > 1) vCount = true;
  100.         }
  101.         if (cycFound) {
  102.             minE = 0;
  103.             ways = 1;
  104.         }
  105.         else if (vCount) {
  106.             minE = 1;
  107.             ways = 0;
  108.             memset(visited, false, sizeof(visited));
  109.             FOR(i, 0, n) {
  110.                 if (edges[i].size()) {
  111.                     ii a = countRB(i, true);
  112.                     ways+=sumN(a.first - 1) + sumN(a.second - 1);
  113.                 }
  114.             }
  115.         }
  116.         else if (m) {
  117.             minE = 2;
  118.             ways = m*(n - 2);
  119.         }
  120.         else {
  121.             minE = 3;
  122.             ways = 0;
  123.             FOR(i, 2, n) {
  124.                 ways += sumN(i-1);
  125.             }
  126.         }
  127.         printf("%I64d %I64d\n", minE, ways);
  128.     }
  129.     return 0;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement