Advertisement
Guest User

Untitled

a guest
Nov 6th, 2015
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.72 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <string>
  6. #include <vector>
  7. #include <set>
  8. #include <map>
  9. #include <algorithm>
  10. #include <ctime>
  11. #include <cmath>
  12. #include <functional>
  13. #include <cassert>
  14. #include <complex>
  15. #include <valarray>
  16. using namespace std;
  17.  
  18. typedef pair<int, int> pii;
  19. #define mp make_pair
  20. #define X first
  21. #define Y second
  22.  
  23. const int INF = (int)1e9 + 100;
  24. const int N = 555;
  25. const int M = 10100;
  26. int n, m;
  27. int cost[M];
  28. int ed[M][2];
  29. vector<pii> G[N];
  30. vector<int> g[N], rg[N];
  31. int ord[N];
  32. int ordSz;
  33. int col[N];
  34. int C;
  35. int minEdge[N];
  36. bool used[N];
  37. bool goodEdge[M];
  38.  
  39. void read()
  40. {
  41.     scanf("%d%d", &n, &m);
  42.     for (int i = 0; i < m; i++)
  43.     {
  44.         int v, u, w;
  45.         scanf("%d%d%d", &v, &u, &w);
  46.         v--;u--;
  47.         cost[i] = w;
  48.         ed[i][0] = v;
  49.         ed[i][1] = u;
  50.         G[v].push_back(mp(u, i));
  51.     }
  52.     return;
  53. }
  54.  
  55. void dfsOrd(int v)
  56. {
  57.     used[v] = 1;
  58.     for (int u : g[v])
  59.         if (!used[u])
  60.             dfsOrd(u);
  61.     ord[ordSz++] = v;
  62.     return;
  63. }
  64. void dfsColor(int v)
  65. {
  66.     col[v] = C;
  67.     for (int u : rg[v])
  68.         if (col[u] == -1)
  69.             dfsColor(u);
  70.     return;
  71. }
  72.  
  73. void dfsCheck(int v)
  74. {
  75.     used[v] = 1;
  76.     for (pii e : G[v])
  77.     {
  78.         if (cost[e.second] != 0) continue;
  79.         int u = e.first;
  80.         if (!used[u])
  81.         {
  82.             goodEdge[e.second] = true;
  83.             dfsCheck(u);
  84.         }
  85.     }
  86.     return;
  87. }
  88. bool check(int sz, int V)
  89. {
  90.     for (int i = 0; i < sz; i++)
  91.         used[i] = false;
  92.     dfsCheck(V);
  93.     for (int i = 0; i < sz; i++)
  94.         if (!used[i])
  95.         {
  96.             for (int e = 0; e < m; e++)
  97.                 goodEdge[e] = false;
  98.             return false;
  99.         }
  100.     return true;
  101. }
  102.  
  103. void dfsAns(int v)
  104. {
  105.     used[v] = true;
  106.     for (pii e : G[v])
  107.     {
  108.         if (cost[e.second] != 0) continue;
  109.         int u = e.first;
  110.         if (used[u] || col[v] != col[u]) continue;
  111.         goodEdge[e.second] = true;
  112.         dfsAns(u);
  113.     }
  114.     return;
  115. }
  116.  
  117. void solve(int sz, int V)
  118. {
  119.     if (sz == 1) throw;
  120.     for (int i = 0; i < sz; i++)
  121.         minEdge[i] = INF;
  122.     for (int v = 0; v < sz; v++)
  123.         for (pii e : G[v])
  124.             minEdge[e.first] = min(minEdge[e.first], cost[e.second]);
  125.     for (int v = 0; v < sz; v++)
  126.         for (pii e : G[v])
  127.             if (e.first != V)
  128.                 cost[e.second] -= minEdge[e.first];
  129.     if (check(sz, V))
  130.         return;
  131.     for (int v = 0; v < sz; v++)
  132.     {
  133.         g[v].clear();
  134.         rg[v].clear();
  135.     }
  136.     for (int v = 0; v < sz; v++)
  137.         for (pii e : G[v])
  138.             if (e.first != V && cost[e.second] == 0)
  139.             {
  140.                 g[v].push_back(e.first);
  141.                 rg[e.first].push_back(v);
  142.             }
  143.     ordSz = 0;
  144.     for (int i = 0; i < sz; i++)
  145.         used[i] = false;
  146.     for (int v = 0; v < sz; v++)
  147.         if (!used[v])
  148.             dfsOrd(v);
  149.     if (ordSz != sz) throw;
  150.     reverse(ord, ord + sz);
  151.     for (int v = 0; v < sz; v++)
  152.         col[v] = -1;
  153.     C = 0;
  154.     for (int i = 0; i < sz; i++)
  155.     {
  156.         int v = ord[i];
  157.         if (col[v] != -1) continue;
  158.         dfsColor(v);
  159.         C++;
  160.     }
  161.     if (C == sz) throw;
  162.     vector<pii> NG[N];
  163.     for (int i = 0; i < sz; i++)
  164.         NG[i].clear();
  165.     for (int v = 0; v < sz; v++)
  166.         for (pii e : G[v])
  167.         {
  168.             int nv = col[v], nu = col[e.first];
  169.             if (nv == nu) continue;
  170.             NG[nv].push_back(mp(nu, e.second));
  171.         }
  172.     for (int v = 0; v < sz; v++)
  173.         swap(G[v], NG[v]);
  174.     int ncol[N];
  175.     for (int v = 0; v < sz; v++)
  176.         ncol[v] = col[v];
  177.     solve(C, col[V]);
  178.     for (int v = 0; v < sz; v++)
  179.         col[v] = ncol[v];
  180.     for (int v = 0; v < sz; v++)
  181.         swap(G[v], NG[v]);
  182.     for (int v = 0; v < sz; v++)
  183.         used[v] = false;
  184.     for (int v = 0; v < sz; v++)
  185.         for (pii e : G[v])
  186.         {
  187.             int u = e.first;
  188.             if (!used[u] && goodEdge[e.second])
  189.                 dfsAns(u);
  190.         }
  191.     return;
  192. }
  193.  
  194. int main()
  195. {
  196. #ifdef LOCAL
  197.     freopen ("input.txt", "r", stdin);
  198.     freopen ("output.txt", "w", stdout);
  199.     freopen ("err.txt", "w", stderr);
  200. #endif
  201.  
  202.     read();
  203.     solve(n, 0);
  204.     printf("%d\n", n - 1);
  205.     for (int i = 0; i < m; i++)
  206.         if (goodEdge[i])
  207.             printf("%d ", i + 1);
  208.     printf("\n");
  209.  
  210.     return 0;
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement