Advertisement
Guest User

Untitled

a guest
Apr 24th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.15 KB | None | 0 0
  1. #include <fstream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. #define NMax 10100
  6.  
  7. using namespace std;
  8.  
  9. ifstream f("online.in");
  10. ofstream g("online.out");
  11.  
  12. int nodes, nEdges, queries, disTree[210];
  13. struct edge {
  14.     short int node1;
  15.     short int node2;
  16.     short int cost;
  17. } newEdge;
  18.  
  19. vector<edge> edges;
  20.  
  21. bool cmp(const edge e1, const edge e2)
  22. {
  23.     return e1.cost < e2.cost;
  24. }
  25.  
  26. int findFather(int node)
  27. {
  28.      
  29.     while (disTree[node] > 0)
  30.         node = disTree[node];
  31.      
  32.     return node;
  33. }
  34.  
  35. void insertEdge(edge newEdge)
  36. {
  37.     for (int i=0; i < nEdges; i++) {
  38.         if (newEdge.cost < edges[i].cost) {
  39.             edges.insert(edges.begin() + i, newEdge);
  40.             return;
  41.         }
  42.     }
  43. }
  44.  
  45. int kruskal(int c) {
  46.     int cost = 0;
  47.      
  48.     if (c == 1)
  49.         insertEdge(newEdge);
  50.      
  51.     for (int i=1; i<=nodes; i++)
  52.         disTree[i] = -1;
  53.      
  54.     nEdges = 0;
  55.     for (int i=0; nEdges < nodes - 1; i++) {
  56.         edge crtEdge = edges[i];
  57.          
  58.         int fath1 = findFather(crtEdge.node1);
  59.         int fath2 = findFather(crtEdge.node2);
  60.          
  61.         if (fath1 != fath2) {
  62.             if (-disTree[fath1] > -disTree[fath2]) {
  63.                 disTree[fath1] += disTree[fath2];
  64.                 disTree[fath2] = fath1;
  65.             }
  66.             else {
  67.                 disTree[fath2] += disTree[fath1];
  68.                 disTree[fath1] = fath2;
  69.             }
  70.              
  71.             ++nEdges;
  72.             edges[nEdges-1].node1 = crtEdge.node1;
  73.             edges[nEdges-1].node2 = crtEdge.node2;
  74.             edges[nEdges-1].cost = crtEdge.cost;
  75.              
  76.             cost += crtEdge.cost;
  77.         }
  78.     }
  79.      
  80.     return cost;
  81. }
  82.  
  83. int main()
  84. {
  85.     f>>nodes>>nEdges;
  86.  
  87.     edge edg;
  88.     for (int i=1; i<=nEdges; i++) {
  89.         f>>edg.node1>>edg.node2>>edg.cost;
  90.          
  91.         edges.push_back(edg);
  92.     }
  93.      
  94.     sort (edges.begin(), edges.end(), cmp);
  95.     g<<kruskal(0)<<"\n";
  96.      
  97.     f>>queries;
  98.     for (int i=1; i<=queries; i++) {
  99.         f>>newEdge.node1>>newEdge.node2>>newEdge.cost;
  100.          
  101.         g<<kruskal(1)<<"\n";
  102.     }
  103.      
  104.     return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement