Advertisement
Malinovsky239

K (Zaoch 2011-2012)

Jan 15th, 2012
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.22 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <vector>
  6.  
  7. #define pb push_back
  8. #define N 5005
  9.  
  10. using namespace std;
  11.  
  12. vector<int> graph[N], num[N], edge[N];
  13. bool g[N][N], was[N], used[N][N];
  14. int same[N][N], in_distance_2[N], twice[N][N];
  15.  
  16. typedef long long LL;
  17.  
  18. int main() {
  19.     int n, m;
  20.     cin >> n >> m;
  21.  
  22.     for (int i = 0; i < m; i++) {
  23.         int r1, r2;
  24.         cin >> r1 >> r2;
  25.  
  26.         graph[r1].pb(r2);
  27.         graph[r2].pb(r1);
  28.         num[r1].pb(i);
  29.         num[r2].pb(i);
  30.         g[r1][r2] = g[r2][r1] = 1;
  31.     }  
  32.  
  33.     LL res = n;
  34.     res += n * (n - 1) / 2 - m;
  35.  
  36.     LL subres = 0, subres2 = 0;
  37.  
  38.     for (int i = 1; i <= n; i++)
  39.         for (int j = 0; j < graph[i].size(); j++) {
  40.             int to = graph[i][j];          
  41.             for (int k = 0; k < graph[to].size(); k++) {
  42.                 int to2 = graph[to][k];
  43.                 if (to2 != i) {
  44.                     if (!used[ num[to][k] ][i]) {
  45.                         in_distance_2[i]++;
  46.                         edge[ num[to][k] ].pb(i);
  47.                         used[ num[to][k] ][i] = true;
  48.                     }
  49.                 }
  50.             }
  51.         }
  52.  
  53.     memset(was, false, sizeof(was));
  54.  
  55.     for (int i = 1; i <= n; i++)
  56.         for (int j = 0; j < graph[i].size(); j++) {
  57.             int to = graph[i][j];
  58.             for (int k = 0; k < graph[to].size(); k++) {
  59.                 int v1 = i, v2 = graph[to][k];
  60.                 twice[v1][v2]++;
  61.             }
  62.         }
  63.        
  64.  
  65.     for (int i = 0; i < m; i++)      
  66.         for (int j = 0; j < edge[i].size(); j++)
  67.             for (int k = j + 1; k < edge[i].size(); k++) {
  68.                 int v1 = edge[i][j], v2 = edge[i][k];
  69.                 same[v1][v2]++;
  70.                 same[v2][v1]++;
  71.             }
  72.          
  73.     for (int i = 1; i <= n; i++)
  74.         for (int j = i + 1; j <= n; j++) {
  75.             if (!g[i][j]) {
  76.                 int cnt = 2;
  77.                 for (int k = 0; k < graph[i].size(); k++) {
  78.                     int to = graph[i][k];
  79.                     was[to] = true;
  80.                     cnt++;
  81.                 }
  82.                 for (int k = 0; k < graph[j].size(); k++) {
  83.                     int to = graph[j][k];
  84.                     if (!was[to])
  85.                         cnt++;
  86.                 }
  87.                 if (n - cnt > 1) {
  88.                     subres += (n - cnt) * (n - cnt - 1) / 2 - (m - int(graph[i].size()) - int(graph[j].size()) - in_distance_2[i] - in_distance_2[j] + twice[i][j] + twice[j][i] + same[i][j]);
  89.                 }
  90.                 subres2 += n - cnt;
  91.                
  92.                 for (int k = 0; k < graph[i].size(); k++) {
  93.                     int to = graph[i][k];
  94.                     was[to] = false;
  95.                 }
  96.             }
  97.         }
  98.                      
  99.     res += subres / 6 + subres2 / 3;
  100.     cout << res << endl;
  101.  
  102.     return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement