Advertisement
Guest User

Untitled

a guest
Jun 19th, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.97 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int NMAX = 3300;
  6. const int INF = INT_MAX/3;
  7.  
  8. int n;
  9. int graph[NMAX][NMAX];
  10. pair<int, int> dist[NMAX];
  11. vector<pair<int, int> > tree[NMAX];
  12. float x_[NMAX], y_[NMAX];
  13. int vis[NMAX];
  14. vector<int> order;
  15.  
  16. string to_string(int v){
  17.     string ans = "";
  18.     if(v == 0){
  19.         return "0";
  20.     }
  21.     while(v > 0){
  22.         ans += string(1, '0' + v % 10);
  23.         v /= 10;
  24.     }
  25.     reverse(ans.begin(), ans.end());
  26. }
  27.  
  28. string buildFileName(int num){
  29.     string fileName = "ent";
  30.     if(num < 10){
  31.         fileName += "0";
  32.     }
  33.     fileName += std::to_string(num);
  34.     fileName += ".txt";
  35.     return fileName;
  36. }
  37.  
  38. int nint(float distance){
  39.     return (int) (distance + 0.5);
  40. }
  41.  
  42. void readAndBuildGraph(string &fileName){
  43.     int id;
  44.     float readx, ready;
  45.     int read = 0;
  46.     FILE* file = fopen(fileName.c_str(), "r");
  47.     fscanf(file, "%d", &n);
  48.     order.clear();
  49.     for(int i = 0; i <= n; i++){
  50.         tree[i].clear();
  51.         dist[i] = make_pair(INF, -1);
  52.         vis[i] = 0;
  53.     }
  54.     while(read++ < n){
  55.         fscanf(file, "%d %f %f", &id, &readx, &ready);
  56.         x_[id] = readx;
  57.         y_[id] = ready;
  58.     }
  59.     fclose(file);
  60.     for(int i = 1; i <= n; i++){
  61.         for(int j = 1; j <= n; j++) if(i != j) {
  62.             float xd = x_[i] - x_[j];
  63.             float yd = y_[i] - y_[j];
  64.             int dij = nint( sqrt(xd * xd + yd * yd) );
  65.             graph[i][j] = dij;
  66.             graph[j][i] = dij;
  67.         }else{
  68.             graph[i][i] = 0;
  69.         }
  70.     }
  71. }
  72.  
  73. //finding minimum vertex
  74. pair<int, int> findMin(){
  75.     int ans = -1;
  76.     int best = INF;
  77.     int fromNode = INF;
  78.     for(int i = 1; i <= n; i++){
  79.         if(!vis[i]){
  80.             if(dist[i].first < best){
  81.                 ans = i;
  82.                 best = dist[i].first;
  83.                 fromNode = dist[i].second;
  84.             }else if(dist[i].first == best){
  85.                 if(dist[i].second < fromNode){//in case of tie, getting the lowest index from the tree
  86.                     ans = i;
  87.                     fromNode = dist[i].second;
  88.                 }else if(dist[i].second == fromNode){
  89.                     //in case of tie again, we have already got the lowest index
  90.                 }
  91.             }
  92.         }
  93.     }
  94.     return make_pair(ans, fromNode);
  95. }
  96.  
  97. //running prim algorithm
  98. void prim(){
  99.     dist[1] = make_pair(0, 1);//first = distance, second = who I came from
  100.     for(int i = 1; i <= n; i++){
  101.         pair<int, int> best = findMin();
  102.         int newNode = best.first;//new node to join the mst
  103.         int fromNode = best.second;//node that 'newNode' came from
  104.         vis[newNode] = 1;
  105.         if(dist[newNode].second != newNode){//building the tree to run a
  106.             tree[newNode].push_back(make_pair(graph[newNode][treeNode], treeNode));
  107.             tree[treeNode].push_back(make_pair(graph[treeNode][newNode], newNode));
  108.         }
  109.         for(int v = 1; v <= n; v++){
  110.             if(!vis[v] && graph[newNode][v] < dist[v].first){
  111.                 dist[v] = make_pair(graph[newNode][v], newNode);
  112.             }
  113.         }
  114.     }
  115. }
  116.  
  117. void preOrder(int root, int parent){
  118.     //sorting by distance, and if have a tie, by lowest index
  119.     sort(tree[root].begin(), tree[root].end());
  120.     order.push_back(root);
  121.     for(int i = 0; i < tree[root].size(); i++){
  122.         int child = tree[root][i].second;
  123.         if(child != parent){
  124.             preOrder(child, root);
  125.         }
  126.     }
  127. }
  128.  
  129. int main(){
  130.     srand(time(NULL));
  131.     int m;
  132.     scanf("%d", &m);
  133.     FILE *out = fopen("saida2.txt", "w");
  134.     for(int test = 1; test <= m; test++){
  135.         string fileName = buildFileName(test);
  136.         readAndBuildGraph(fileName);
  137.         prim();
  138.         preOrder(1, 1);
  139.         int ans = 0;
  140.         for(int i = 0; i < order.size(); i++){
  141.             ans += graph[order[i]][order[(i + 1) % order.size()]];
  142.         }
  143.         fprintf(out, "%d\n", (n == 0) ? 0 : ans);
  144.     }
  145.     fclose(out);
  146.     return 0;
  147. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement