Advertisement
vitalii24

Number of routes

Jan 7th, 2024
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.26 KB | Source Code | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. struct Edge
  5. {
  6.     public:
  7.     int from;
  8.     int to;
  9.     int weight;
  10.     int id;
  11.  
  12.     Edge(int f, int t, int w, int id)
  13.     {
  14.         this -> from = f;
  15.         this->to = t;
  16.         this->weight = w;
  17.         this->id = id;
  18.     }
  19. };
  20.  
  21. void MaxEdgeSearch(vector<vector<Edge * >> & gr, int v, vector<bool> & usedEdges, vector<bool> & usedVertex, Edge * & maxEdge)
  22. {
  23.     usedVertex[v] = true;
  24.  
  25.     for (Edge * edge : gr[v])
  26.     {
  27.         int u = (v == edge -> from ? edge -> to : edge -> from);        
  28.         if ( usedVertex[u] == true || usedEdges[ edge -> id ]) //boundary of graph reached
  29.         {
  30.             continue;
  31.         }
  32.  
  33.         if (maxEdge == NULL)
  34.         {
  35.             maxEdge = edge;
  36.         }
  37.         else
  38.         {
  39.             if (edge -> weight > maxEdge -> weight)
  40.             {
  41.                 maxEdge = edge;
  42.             }
  43.         }
  44.  
  45.         MaxEdgeSearch(gr, u, usedEdges, usedVertex, maxEdge);
  46.     }
  47. }
  48.  
  49. void CalculateDistance(vector<vector<Edge * >> & gr, int v, map<int, int> & dist, vector<bool> & usedEdges, vector<bool> & usedVertex, map<int, int> & routesPerDistance)
  50. {
  51.     usedVertex[v] = false;
  52.  
  53.     for (Edge * edge : gr[v])
  54.     {
  55.         int u = (v == edge -> from ? edge -> to : edge -> from);      
  56.         if ( usedVertex[u] == false || usedEdges[ edge -> id ])  //boundary of graph reached
  57.         {
  58.             continue;
  59.         }
  60.  
  61.         dist[u] = dist[v] + 1;
  62.         routesPerDistance[dist[u]]++;
  63.         CalculateDistance(gr, u, dist, usedEdges, usedVertex, routesPerDistance);
  64.     }
  65. }
  66.  
  67. int Calculate(vector<vector<Edge*>> & gr, vector<bool> & usedEdges, int v, int & n, int & k)
  68. {
  69.     Edge * edge = NULL;
  70.     vector<bool> usedVertex(n, false);
  71.     MaxEdgeSearch(gr, v, usedEdges, usedVertex, edge);
  72.  
  73.     if (edge == NULL)
  74.     {
  75.         //graph is empty
  76.         return 0;
  77.     }
  78.  
  79.     int from = edge -> from;
  80.     int to = edge -> to;
  81.     int weight = edge -> weight;
  82.     int edgeId = edge -> id;
  83.  
  84.     usedEdges[edgeId] = true;
  85.     map<int, int> dist;
  86.     dist[from] = 0;
  87.     dist[to] = 0;  
  88.  
  89.     map<int, int> leftRoutesByDistance;
  90.     map<int, int> rightRoutesByDistance;
  91.  
  92.     leftRoutesByDistance[0] = rightRoutesByDistance[0] = 1;
  93.  
  94.     CalculateDistance(gr, from, dist, usedEdges, usedVertex, leftRoutesByDistance);
  95.     CalculateDistance(gr, to, dist, usedEdges, usedVertex, rightRoutesByDistance);
  96.  
  97.     int maxEdgesCount = weight - 1 - k;  
  98.     int ans = 0;
  99.  
  100.     for (int i = 0; i <= maxEdgesCount; i++)
  101.     {
  102.         for (int j = 0; j <= maxEdgesCount - i; j++)
  103.             ans += 2 * leftRoutesByDistance[i] * rightRoutesByDistance[j];
  104.     }
  105.  
  106.     ans += Calculate(gr, usedEdges, from, n, k);
  107.     ans += Calculate(gr, usedEdges, to, n, k);
  108.    
  109.     return ans;
  110. }
  111.  
  112. int main()
  113. {
  114.     int n, k, a, b, c;
  115.     cin >> n >> k;
  116.     int ans = 0;
  117.  
  118.     vector<bool> usedEdges(n, false);
  119.     vector<vector<Edge*>> gr(n, vector<Edge*>());
  120.    
  121.     for (int i = 1; i < n ; i++)
  122.     {
  123.         cin >> a >> b >> c;
  124.         Edge * edge = new Edge(a - 1, b - 1, c, i);
  125.         gr[a - 1].push_back(edge);
  126.         gr[b - 1].push_back(edge);
  127.     }
  128.  
  129.     ans = Calculate(gr, usedEdges, 0, n, k);
  130.     cout<<ans<<endl;
  131.     return 0;
  132. }
  133.  
Tags: Graphs
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement