Source code for submission s684

fr.cpp

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <iostream>
  4. #include <string>
  5. #include <cstdlib>
  6. #include <map>
  7.  
  8. using namespace std;
  9.  
  10. struct Edge
  11. {
  12. Edge(int _dest, int _value): dest(_dest), value(_value) { }
  13. int dest;
  14. int value;
  15. };
  16.  
  17. typedef std::multimap<int, Edge*> m;
  18.  
  19. int count(std::multimap<int, Edge*> &connections, int nodeId, int parentId)
  20. {
  21.  
  22. std::pair<m::iterator, m::iterator> range = connections.equal_range(nodeId);
  23. int sum = 0, mine = 0;
  24. for (std::multimap<int, Edge*>::iterator it = range.first; it != range.second; ++it)
  25. {
  26. if (it->second->dest == parentId)
  27. {
  28. mine = it->second->value;
  29. continue;
  30. }
  31. sum += count(connections, it->second->dest, nodeId);
  32. }
  33.  
  34. if (nodeId == parentId)
  35. return sum;
  36. if (distance(range.first, range.second) == 1)
  37. return mine;
  38. return std::min(sum, mine);
  39. }
  40.  
  41. int main()
  42. {
  43. int nodeCount, rootId;
  44. while (scanf("%d %d", &nodeCount, &rootId) == 2)
  45. {
  46. --nodeCount;
  47. std::multimap<int, Edge*> connections;
  48. while (nodeCount--)
  49. {
  50. int nodeId1, nodeId2, value;
  51. scanf("%d %d %d", &nodeId1, &nodeId2, &value);
  52. connections.insert(std::pair<int, Edge*>(nodeId1, new Edge(nodeId2, value)));
  53. connections.insert(std::pair<int, Edge*>(nodeId2, new Edge(nodeId1, value)));
  54. }
  55. printf("%d\n", count(connections, rootId, rootId));
  56. for (std::multimap<int, Edge*>::iterator it = connections.begin(); it != connections.end(); ++it)
  57. delete (it->second);
  58. connections.clear();
  59. }
  60. return 0;
  61. }
  62.