Guest User

Untitled

a guest
Nov 6th, 2015
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.99 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4. #include <ctime>
  5. #include <cassert>
  6. #include <cstdio>
  7. #include <queue>
  8. #include <set>
  9. #include <map>
  10. #include <fstream>
  11. #include <cstdlib>
  12. #include <string>
  13. #include <cstring>
  14. #include <algorithm>
  15. #include <numeric>
  16.  
  17. #define mp make_pair
  18. #define mt make_tuple
  19. #define fi first
  20. #define se second
  21. #define pb push_back
  22. #define all(x) (x).begin(), (x).end()
  23. #define rall(x) (x).rbegin(), (x).rend()
  24. #define forn(i, n) for (int i = 0; i < (int)(n); ++i)
  25. #define for1(i, n) for (int i = 1; i <= (int)(n); ++i)
  26. #define ford(i, n) for (int i = (int)(n) - 1; i >= 0; --i)
  27. #define fore(i, a, b) for (int i = (int)(a); i <= (int)(b); ++i)
  28.  
  29. using namespace std;
  30.  
  31. typedef pair<int, int> pii;
  32. typedef vector<int> vi;
  33. typedef vector<pii> vpi;
  34. typedef vector<vi> vvi;
  35. typedef long long i64;
  36. typedef vector<i64> vi64;
  37. typedef vector<vi64> vvi64;
  38.  
  39. template<class T> bool uin(T &a, T b) { return a > b ? (a = b, true) : false; }
  40. template<class T> bool uax(T &a, T b) { return a < b ? (a = b, true) : false; }
  41.  
  42. struct TEdge {
  43.     int to, w, id;
  44.  
  45.     TEdge(int to = 0, int w = 0, int id = 0)
  46.         : to(to)
  47.         , w(w)
  48.         , id(id)
  49.     {
  50.     }
  51. };
  52.  
  53. typedef vector< vector<TEdge> > TGraph;
  54.  
  55. void dfs0(int v, TGraph &e, vi &vis, vi &tre) {
  56.     vis[v] = 1;
  57.     for (TEdge w: e[v]) {
  58.         if (w.w || vis[w.to]) continue;
  59.         tre.pb(w.id);
  60.         dfs0(w.to, e, vis, tre);
  61.     }
  62. }
  63.  
  64. void dfs_ord(int v, TGraph &e, vi &vis, vi &ord) {
  65.     if (vis[v]) return;
  66.     vis[v] = 1;
  67.     for (TEdge w: e[v]) dfs_ord(w.to, e, vis, ord);
  68.     ord.pb(v);
  69. }
  70.  
  71. void dfs_comp(int v, TGraph &e, vi &vis, vi &comp, int cc) {
  72.     if (vis[v]) return;
  73.     comp[v] = cc;
  74.     vis[v] = 1;
  75.     for (TEdge w: e[v]) dfs_comp(w.to, e, vis, comp, cc);
  76. }
  77.  
  78. void dfs_cc0(int v, TGraph &e, vi &vis, vi &comp, vi &tre) {
  79.     if (vis[v]) return;
  80.     vis[v] = 1;
  81.     for (TEdge w: e[v]) {
  82.         if (vis[w.to] || comp[w.to] != comp[v]) continue;
  83.         tre.pb(w.id);
  84.         dfs_cc0(w.to, e, vis, comp, tre);
  85.     }
  86. }
  87.  
  88. TGraph rev(TGraph g) {
  89.     int n = g.size();
  90.     TGraph rg(n);
  91.     forn(i, n) for (TEdge w: g[i]) rg[w.to].pb(TEdge(i, w.w, w.id));
  92.     return rg;
  93. }
  94.  
  95. vi condense(TGraph &e) {
  96.     int n = e.size();
  97.     vi vis(n), ord;
  98.     forn(i, n) dfs_ord(i, e, vis, ord);
  99.     reverse(all(ord));
  100.     vis.assign(n, 0);
  101.     TGraph re = rev(e);
  102.     vi comp(n);
  103.     int cc = 0;
  104.     for (int v: ord) {
  105.         if (vis[v]) continue;
  106.         dfs_comp(v, re, vis, comp, cc++);
  107.     }
  108.     return comp;
  109. }
  110.  
  111. vi mst(int v, TGraph e) {
  112. //    cerr << e.size() << '\n';
  113.     int n = e.size();
  114.     vi pot(n, 1e9);
  115.     forn(i, n) for (TEdge w: e[i]) uin(pot[w.to], w.w);
  116.     TGraph e0(n);
  117.     forn(i, n) for (TEdge &w: e[i]) {
  118.         w.w -= pot[w.to];
  119.         if (!w.w) e0[i].pb(w);
  120.     }
  121.     vi vis(n);
  122.     vi tre;
  123.     dfs0(v, e0, vis, tre);
  124.     if (tre.size() == n - 1) return tre;
  125.     vi comp = condense(e0);
  126.     int cc = *max_element(all(comp)) + 1;
  127.     TGraph ne(cc);
  128.     forn(i, n) for (TEdge w: e[i]) {
  129.         if (comp[i] != comp[w.to]) ne[comp[i]].pb(TEdge(comp[w.to], w.w, w.id));
  130.     }
  131.     vi cmst = mst(comp[v], ne);
  132.     set<int> cid(all(cmst));
  133.     vis.assign(n, 0);
  134.     dfs_cc0(v, e0, vis, comp, cmst);
  135.     forn(i, n) for (TEdge w: e[i]) {
  136.         if (cid.count(w.id)) dfs_cc0(w.to, e0, vis, comp, cmst);
  137.     }
  138.     return cmst;
  139. }
  140.  
  141. int main() {
  142.     ios::sync_with_stdio(false);
  143.     cin.tie(nullptr);
  144.     cout.precision(10);
  145.     cout << fixed;
  146. #ifdef LOCAL_DEFINE
  147.     freopen("input.txt", "rt", stdin);
  148. #endif
  149.  
  150.     int N, M;
  151.     cin >> N >> M;
  152.     TGraph e(N);
  153.     forn(i, M) {
  154.         int x, y, z;
  155.         cin >> x >> y >> z;
  156.         --x; --y;
  157.         e[x].pb(TEdge(y, z, i + 1));
  158.     }
  159.     vi ans = mst(0, e);
  160.     cout << ans.size() << '\n';
  161.     for (int x: ans) cout << x << ' ';
  162.     cout << '\n';
  163.  
  164. #ifdef LOCAL_DEFINE
  165.     cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
  166. #endif
  167.     return 0;
  168. }
Advertisement
Add Comment
Please, Sign In to add comment