Advertisement
Malinovsky239

Untitled

Feb 4th, 2013
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.41 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <cstdlib>
  5. #include <cstring>
  6. #include <string>
  7. #include <vector>
  8. #include <map>
  9. #include <set>
  10. #include <cmath>
  11. #include <ctime>
  12. #include <cassert>
  13.  
  14. using namespace std;
  15.  
  16. #define pb push_back
  17. #define mp make_pair
  18. #define sz(A) (int)(A).size()
  19.  
  20. typedef long long LL;
  21. typedef long double LD;
  22.  
  23. const int N = 205, M = 1005;
  24.  
  25. vector<int> graph[N], ts, g[M], suf[N], num[N];
  26. bool dp[N][N], was[M], ok[N];
  27. int from[N][N], from_num[N][N], color[M], cur, n, m, t;
  28.  
  29. void dfs(int v) {
  30.     was[v] = 1;
  31.     color[v] = cur;
  32.     for (int i = 0; i < sz(graph[v]); i++) {
  33.         int to = graph[v][i];
  34.         if (!was[to])
  35.             dfs(to);
  36.     }
  37.     ts.pb(v);
  38. }
  39.  
  40. void dfs2(int v) {
  41.     was[v] = 1;
  42.     for (int i = 0; i < sz(g[v]); i++) {
  43.         int to = g[v][i];
  44.         if (!was[to])
  45.             dfs2(to);
  46.     }
  47. }
  48.    
  49. int main()
  50. {
  51.     freopen("suffix.in", "r", stdin);
  52.     freopen("suffix.out", "w", stdout);
  53.    
  54.     cin >> n >> m >> t;
  55.     for (int i = 0; i < t; i++) {
  56.         int term;
  57.         cin >> term;
  58.         ok[term] = 1;
  59.     }
  60.  
  61.     for (int i = 0; i < m; i++) {
  62.         int s, t;
  63.         cin >> s >> t;
  64.         graph[s].pb(t);
  65.         num[s].pb(i);
  66.     }
  67.  
  68.     dfs(1);
  69.  
  70.     dp[1][0] = 1;
  71.  
  72.     for (int i = sz(ts) - 1; i >= 0; i--) {
  73.         int v = ts[i];
  74.         for (int j = 0; j < n; j++) {
  75.             if (dp[v][j]) {
  76.                 for (int q = 0; q < sz(graph[v]); q++) {
  77.                     int to = graph[v][q];
  78.                     dp[to][j + 1] = 1;
  79.                     from[to][j + 1] = v;
  80.                     from_num[to][j + 1] = num[v][q];
  81.                 }          
  82.             }
  83.         }
  84.     }
  85.  
  86.     int mx = 0;
  87.  
  88.     for (int i = 1; i <= n; i++) {
  89.         if (ok[i]) {
  90.             for (int j = 0; j < n; j++) {
  91.                 if (dp[i][j]) {
  92.                     //cerr << i << " " << j << endl;
  93.                     mx = max(mx, j);
  94.                     int nowv = i;
  95.                    
  96.                     for (int k = j; k > 0; k--) {
  97.                         suf[j].pb(from_num[nowv][k]);
  98.                         nowv = from[nowv][k];
  99.                     }                  
  100.                 }          
  101.             }          
  102.         }
  103.     }  
  104.  
  105.     for (int i = 0; i < mx; i++) {
  106.         for (int j = i + 1; j <= mx; j++) {
  107.             g[ suf[i + 1][i] ].pb(suf[j][i]);
  108.             g[ suf[j][i] ].pb(suf[i + 1][i]);              
  109.             fprintf(stderr, "%d - %d\n", suf[j][i], suf[i + 1][i]);
  110.         }  
  111.     }
  112.        
  113.     memset(was, 0, sizeof(was));
  114.     for (int i = 0; i < m; i++) {
  115.         if (!was[i]) {
  116.             cur++;
  117.             dfs2(i);
  118.         }
  119.     }
  120.  
  121.     cout << mx + 1 << " " << cur << endl;
  122.    
  123.     for (int i = 0; i < mx; i++) {
  124.         cerr << suf[mx][i] << endl;
  125. //      return 0;
  126.         cout << color[ suf[mx][i]   ] << " ";
  127.     }
  128.     cout << endl;
  129.  
  130.     for (int i = 0; i < m; i++)
  131.         cout << color[i] << " ";
  132.     cout << endl;
  133.  
  134.     return 0;
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement