Advertisement
Guest User

Untitled

a guest
Apr 5th, 2020
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.61 KB | None | 0 0
  1. #include "stdio.h"
  2. #include "malloc.h"
  3. #include "stdlib.h"
  4. #define INT_MAX 2147483647
  5. #define MAX_LENGTH INT_MAX
  6.  
  7. typedef struct edge {
  8.     int first;
  9.     int second;
  10.     int weight;
  11. } edge;
  12.  
  13.  
  14. void swap(void *a, void *b, size_t size) {
  15.     char tmp;
  16.     size_t i;
  17.     for (i = 0; i < size; i++) {
  18.         tmp = *((char*) b + i);
  19.         *((char*) b + i) = *((char*) a + i);
  20.         *((char*) a + i) = tmp;
  21.     }
  22. }
  23.  
  24.  
  25.  
  26. int find_set (int* p, int v) {
  27.     if ( p[v] == v) {
  28.         return v;
  29.     }
  30.     return p[v] = find_set(p, p[v]);
  31. }
  32.  
  33.  
  34.  
  35. int partition (edge* a, int l, int r) {
  36.     edge v = a[(l + r)/2];
  37.     int i = l;
  38.     int j = r;
  39.     while (i <= j) {
  40.         while (a[i].weight < v.weight) {
  41.             i++;
  42.         }
  43.         while (a[j].weight > v.weight) {
  44.             j--;
  45.         }
  46.         if (i >= j) {
  47.             break;
  48.         }
  49.         swap (&a[i], &a[j], sizeof(edge));
  50.         i++;
  51.         j--;
  52.     }
  53.     return j;
  54. }
  55.  
  56.  
  57.  
  58. void quick_sort (edge* a, int l, int r) {
  59.     if (l < r) {
  60.         int q = partition(&a[0], l, r);
  61.         quick_sort(a, l, q);
  62.         quick_sort(a, q + 1, r);
  63.     }
  64. }
  65.  
  66.  
  67.  
  68. void union_set (int* p, int* count, int v1, int v2) {
  69.     v1 = p[v1];
  70.     v2 = p[v2];
  71.     if (v1 == v2) {
  72.         return;
  73.     }
  74.  
  75.     if (count[v1] < count[v2]) {
  76.         swap(&v1, &v2, sizeof(int));
  77.     }
  78.     p[v2] = v1;
  79.     if (count[v1] == count[v2]) {
  80.         count[v1]++;
  81.     }
  82. }
  83.  
  84.  
  85.  
  86. int main() {
  87.  
  88.     int n, m;
  89.    
  90.    scanf("%d%d", &n, &m);
  91.  
  92.    
  93.  
  94.     if (n < 0 || n > 5000) {
  95.         printf( "bad number of vertices");
  96.         return 0;
  97.     }
  98.  
  99.     if (m < 0 || m > n*(n-1)/2) {
  100.         printf( "bad number of edges");
  101.         return 0;
  102.     }
  103.  
  104.     if (n == 0 || (m == 0 && n != 1)) {
  105.         printf( "no spanning tree");
  106.         return 0;
  107.     }
  108.  
  109.     int* p = (int*)malloc(sizeof(int)*n);
  110.     int* count = (int*)malloc(sizeof(int)*n);
  111.     int* carcas = (int*)malloc(sizeof(int)*m);
  112.     edge* edges = (edge*)malloc(sizeof(edge)*m);
  113.  
  114.     if (p == NULL || count == NULL || carcas == NULL || edges == NULL) {
  115.         printf( "mem error");
  116.         return 0;
  117.     }
  118.  
  119.     for (int i = 0; i < m; i++) {
  120.         if (scanf("%d %d %d\n", &edges[i].first, &edges[i].second, &edges[i].weight) == EOF) {
  121.             printf("bad number of lines");
  122.             return 0;
  123.         }
  124.  
  125.         if (edges[i].first < 1 || edges[i].first > n || edges[i].second < 1 || edges[i].second > n) {
  126.             printf( "bad vertex");
  127.             return 0;
  128.         }
  129.  
  130.         if (edges[i].weight < 0 || edges[i].weight > MAX_LENGTH) {
  131.             printf( "bad length");
  132.             return 0;
  133.         }
  134.         edges[i].first--;
  135.         edges[i].second--;
  136.     }
  137.  
  138.     if (n == 1) {
  139.         return 0;
  140.     }
  141.  
  142.     if (m < n - 1) {
  143.         printf( "no spanning tree");
  144.         return 0;
  145.     }
  146.  
  147.     quick_sort(&edges[0], 0, m - 1);
  148.  
  149.     for (int i = 0; i < n; i++) {
  150.         p[i] = i;
  151.         count[i] = 0;
  152.     }
  153.  
  154. int count_of_edges = 0;
  155.     for (int i = 0; i < m; i++) {
  156.         if (find_set(&p[0], edges[i].first) == find_set(&p[0], edges[i].second)) {
  157.             continue;
  158.         }
  159.         union_set(&p[0], &count[0], edges[i].first, edges[i].second);
  160.         carcas[count_of_edges] = i;
  161.         count_of_edges++;
  162.     }
  163.  
  164.     int root = p[0];
  165.     for (int i = 0; i < n; i++) {
  166.  
  167.         if (root != find_set(&p[0], i)) {
  168.             printf("no spanning tree");
  169.             return 0;
  170.         }
  171.     }
  172.  
  173.     for (int i = 0; i < count_of_edges; i++) {
  174.         printf( "%d %d\n", edges[carcas[i]].first + 1, edges[carcas[i]].second + 1);
  175.     }
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement