Source code for submission s946

fr.cpp

  1.  
  2. #include <cstdlib>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. int traverse(int node, bool *visited, int **mat, int n) {
  11. visited[node] = true;
  12. int total = 0;
  13. for (int i = 0; i < n; i++) {
  14. if (!visited[i] && mat[node][i]) {
  15. int sub = traverse(i, visited, mat, n);
  16. total += sub && sub < mat[node][i] ? sub : mat[node][i];
  17. }
  18. }
  19. return total;
  20. }
  21.  
  22. int main() {
  23. int nn, nc;
  24. scanf("%d %d", &nn, &nc);
  25. bool quit = false;
  26. while (!quit) {
  27. int n = nn;
  28. int c = nc;
  29.  
  30. // prepare
  31. int **mat = new int *[n];
  32. int *matInner = new int[n*n];
  33. memset(matInner, 0, n*n*sizeof(int));
  34. for (int i = 0; i < n; i++)
  35. mat[i] = matInner+i*n;
  36.  
  37. // read edges
  38. int u, v, w;
  39. while (scanf("%d %d", &u, &v) == 2) {
  40. if (getchar() == '\n') {
  41. nn = u;
  42. nc = v;
  43. goto CMPT;
  44. }
  45. scanf("%d", &w);
  46. // use edge u, v, w
  47. u--, v--;
  48. mat[u][v] = mat[v][u] = w;
  49. }
  50. quit = true;
  51. CMPT:
  52. // compute here
  53. c--;
  54. bool *visited = new bool[n];
  55. memset(visited, 0, n*sizeof(bool));
  56. int result = traverse(c, visited, mat, n);
  57. printf("%d\n", result);
  58. // dealloc
  59. delete [] mat;
  60. delete [] matInner;
  61. }
  62. return 0;
  63. }
  64.  
  65.