Source code for submission s844

Go to diff to previous submission

fr.cpp

  1. #include <algorithm>
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <iostream>
  6. #include <sstream>
  7. #include <map>
  8. #include <set>
  9. #include <queue>
  10. #include <vector>
  11.  
  12. using namespace std;
  13.  
  14. #define FOR(prom, a, b) for(int prom = (a); prom < (b); prom++)
  15. #define FORD(prom, a, b) for(int prom = (a); prom > (b); prom--)
  16. #define FORDE(prom, a, b) for(int prom = (a); prom >= (b); prom--)
  17.  
  18. #define PB push_back
  19. #define MP make_pair
  20.  
  21. #define MM(co, cim) memset((co), (cim), sizeof((co)))
  22.  
  23. #define DEB(x) cerr << ">>> " << #x << " : " << x << endl;
  24.  
  25. int g[1007][1007];
  26. int gv[1007][1007];
  27. int gc[1007];
  28. int inf = 2000000000;
  29.  
  30. int DFS2(int v, int sum1, int par) {
  31. int sum2 = 0;
  32. if(gc[v] == 1) return sum1;
  33. FOR(i,0,gc[v]) {
  34. if(g[v][i] == par) continue;
  35. sum2 += DFS2(g[v][i], gv[v][i], v);
  36. }
  37. return min(sum1, sum2);
  38. }
  39.  
  40. int DFS(int v) {
  41. int sum = 0;
  42. FOR(i,0,gc[v]) {
  43. sum += DFS2(g[v][i], gv[v][i], v);
  44. }
  45. return sum;
  46. }
  47.  
  48. int main ()
  49. {
  50.  
  51. int n,c;
  52. int a,b,v;
  53. while(scanf("%d%d", &n, &c) == 2) {
  54. FOR(i,1,n+1) gc[i] = 0;
  55. FOR(k,0,n-1) {
  56. scanf("%d%d%d", &a, &b, &v);
  57. g[a][gc[a]] = b;
  58. gv[a][gc[a]++] = v;
  59. g[b][gc[b]] = a;
  60. gv[b][gc[b]++] = v;
  61.  
  62. }
  63. printf("%d\n", DFS(c));
  64. }
  65.  
  66. return 0;
  67. }
  68.  

Diff to submission s712

fr.cpp

--- c5.s712.cteam011.fr.cpp.0.fr.cpp
+++ c5.s844.cteam011.fr.cpp.0.fr.cpp
@@ -3,5 +3,4 @@
 #include <cstdio>
 #include <cstdlib>
-#include <cstring>
 #include <iostream>
 #include <sstream>
@@ -24,90 +23,45 @@
 #define DEB(x) cerr << ">>> " << #x << " : " << x << endl;
 
-#define INF 1000000014
+int g[1007][1007];
+int gv[1007][1007];
+int gc[1007];
+int inf = 2000000000;
 
-map<int, int> p;
-int n, c, f, s, t, adj[1014][1014], deg[1014], max_flow;
-vector<int> nodes[1014];
+int DFS2(int v, int sum1, int par) {
+        int sum2 = 0;
+        if(gc[v] == 1) return sum1;
+        FOR(i,0,gc[v]) {
+                if(g[v][i] == par) continue;
+                sum2 += DFS2(g[v][i], gv[v][i], v);
+        }
+        return min(sum1, sum2);
+}
 
-void augmentPath (int v, int minEdge)
-{
-  if (v == s)
-  {
-    f = minEdge;
-    return;
-  }
-  else if (p.count(v))
-  {
-    augmentPath(p[v], min(minEdge, adj[p[v]][v]));
-    adj[p[v]][v] -= f;
-    adj[v][p[v]] += f;
-  }  
+int DFS(int v) {
+        int sum = 0;
+        FOR(i,0,gc[v]) {
+                sum += DFS2(g[v][i], gv[v][i], v);
+        }
+        return sum;
 }
 
 int main ()
 {
-  while (scanf("%d%d", &n, &c) == 2)
-  {
-    p.clear();
-    MM(deg, 0);
-    FOR(i, 0, 1014) 
-    {
-      nodes[i].clear();
-      MM(adj[i], 0);
-    }
-    FOR(i, 0, n - 1)
-    {
-      int from, to, weight;
-      scanf("%d%d%d", &from, &to, &weight);
-      if (to == c)
-      {
-        int tmp = from;
-        from = to;      
-        to = tmp;
-      }
-      nodes[from].PB(to);
-      adj[from][to] = weight;
-      ++deg[from];
-      if (from != c)
-      {
-        nodes[to].PB(from);
-        adj[to][from] = weight;
-        ++deg[to];
-      }
-    }
-    s = c;
-    FOR(i, 1, n + 1) if (deg[i] <= 1)
-    {
-      nodes[i].PB(1009);
-      adj[i][1009] = INF;
-    }
-    t = 1009;
-    max_flow = 0;
-    while (1)
-    {
-      f = 0;
-      queue<int> q; map<int, int> dist;
-      q.push(s); dist[s] = 0;
-      while (!q.empty())
-      {
-        int u = q.front(); q.pop();
-        if (u == t) break;
-        vector<int>::iterator v;
-        for (v = nodes[u].begin(); v != nodes[u].end(); v++)
-        {
-          if (adj[u][*v] > 0 && !dist.count(*v))
-          {
-            dist[*v] = dist[u] + 1;
-            q.push(*v);
-            p[*v] = u;
-          }
-        }
-      }
-      augmentPath(t, INF);
-      if (f == 0) break;
-      max_flow += f;    
-    }
-    printf("%d\n", max_flow);
-  }
+
+        int n,c;
+        int a,b,v;
+        while(scanf("%d%d", &n, &c) == 2) {
+                FOR(i,1,n+1) gc[i] = 0;
+                FOR(k,0,n-1) {
+                        scanf("%d%d%d", &a, &b, &v);
+                        g[a][gc[a]] = b;
+                        gv[a][gc[a]++] = v;
+                        g[b][gc[b]] = a;
+                        gv[b][gc[b]++] = v;
+                        
+                }
+                printf("%d\n", DFS(c));
+        }
+  
   return 0;
 }