Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.42 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<conio.h>
  4. #include <string.h>
  5.  
  6. int i,j,a,b,u,v,ne=1;
  7. int min,mincost=0,parent[];
  8. int find(int);
  9. int uni(int,int);
  10.  
  11. int main()
  12. {
  13.     int anzahl;
  14.  
  15.     printf("Bitte geben Sie die Anzahl der Knoten ein\n");
  16.     scanf("%d",&anzahl);
  17.  
  18.     typedef struct knoten
  19.     {
  20.         char name[15];
  21.         int position;
  22.  
  23.     }KNOTEN;
  24.  
  25.     typedef struct kante
  26.     {
  27.         char knotenA[15];
  28.         char knotenB[15];
  29.         int pos_A;
  30.         int pos_B;
  31.         int cost;
  32.  
  33.  
  34.     }KANTEN;
  35.  
  36.  
  37.     KNOTEN knoten[anzahl];
  38.     KANTEN kanten[anzahl];
  39.  
  40.     for(int i = 0;i<anzahl;i++)
  41.     {
  42.  
  43.         printf("\nKnoten %d\n",i);
  44.         printf("**********\n");
  45.         printf("Geben Sie einen Namen ein(15 Zeichen): ");
  46.         scanf("%s",&knoten[i].name);
  47.         knoten[i].position = i;
  48.  
  49.     }
  50.  
  51.     printf("\nVorhandene Knoten:\n\n");
  52.     for(int i = 0;i<anzahl;i++)
  53.     {
  54.  
  55.         printf("%d. Name: %s \n",i,knoten[i].name);
  56.  
  57.  
  58.     }
  59.  
  60.     printf("\n");
  61.     int matrix[anzahl][anzahl];
  62.  
  63.     int pos_kanten = 0;
  64.  
  65.     for(int zeile = 0;zeile<anzahl;zeile++)
  66.     {
  67.         for(int spalte = 0;spalte<anzahl;spalte++)
  68.         {
  69.  
  70.             if(spalte > zeile){
  71.  
  72.                 char check;
  73.                 printf("\nKante/Strecke zwischen %s und %s vorhanden? (j/n):\n",knoten[zeile].name,knoten[spalte].name);
  74.                 scanf(" %c",&check);
  75.  
  76.  
  77.  
  78.                 if(check == 'j' || check == 'J' || check == 'y'|| check == 'Y')
  79.                 {
  80.                     printf("Bitte Abstand/Kosten eingeben fuer:  %s nach %s\n",knoten[zeile].name,knoten[spalte].name);
  81.                     scanf("%d",&matrix[zeile][spalte]);
  82.  
  83.                     strcpy(kanten[pos_kanten].knotenA,knoten[zeile].name);
  84.                     strcpy(kanten[pos_kanten].knotenB,knoten[spalte].name);
  85.                     kanten[pos_kanten].pos_A = knoten[zeile].position;
  86.                     kanten[pos_kanten].pos_B = knoten[spalte].position;
  87.                     kanten[pos_kanten].cost = matrix[zeile][spalte];
  88.                     pos_kanten = pos_kanten + 1;
  89.  
  90.                 }
  91.                 else
  92.                 {
  93.                         matrix[zeile][spalte] = 0;
  94.                 }
  95.  
  96.  
  97.             }
  98.             if(spalte == zeile)
  99.             {
  100.                 matrix[zeile][spalte] = 0;
  101.             }
  102.  
  103.         }
  104.  
  105.     }
  106.  
  107.     int sort_stellen = ((anzahl*anzahl)-anzahl)/2;
  108.     int sort[sort_stellen];
  109.     int sort_pos = 0;
  110.  
  111.     for(int zeile = 0;zeile<anzahl;zeile++)
  112.     {
  113.         for(int spalte = 0;spalte<anzahl;spalte++)
  114.         {
  115.  
  116.             if(spalte < zeile)
  117.             {
  118.                 matrix[zeile][spalte] = matrix[spalte][zeile];
  119.  
  120.             }
  121.             if(spalte > zeile && matrix[zeile][spalte] != 0)
  122.             {
  123.  
  124.                 sort[sort_pos] = matrix[zeile][spalte];
  125.                 sort_pos = sort_pos +1;
  126.  
  127.             }
  128.  
  129.         }
  130.  
  131.     }
  132.  
  133.  
  134.     //Ausgabe der Kanten
  135.  
  136.     printf("\nEingegebene Kanten: ");
  137.     for(int i = 0; i < sort_pos;i++)
  138.     {
  139.         printf("%d ",sort[i]);
  140.     }
  141.     printf("\n");
  142.  
  143.  
  144.  
  145.    //Bubblesort :)
  146.    for (int i = 1; i < sort_pos ; i++)
  147.    {
  148.       for (int j = 0; j < sort_pos - i ; j++)
  149.       {
  150.           if (kanten[j].cost > kanten[j+1].cost)
  151.           {
  152.               KANTEN temp = kanten[j];
  153.               kanten[j] = kanten[j+1];
  154.               kanten[j+1] = temp;
  155.           }
  156.       }
  157.    }
  158.  
  159. //Ausgabe der Matrix
  160.     printf("\n");
  161.     printf("              ");
  162.     for(int i = 0;i<anzahl;i++)
  163.     {
  164.         printf("%16s",knoten[i].name);
  165.     }
  166.     printf("\n");
  167.     for(int i = 0;i<anzahl;i++)
  168.     {
  169.         printf("%15s",knoten[i].name);
  170.         for(int j = 0;j<anzahl;j++)
  171.         {
  172.  
  173.             printf("%15d ",matrix[i][j]);
  174.  
  175.         }
  176.         printf("\n");
  177.     }
  178.  
  179.  
  180.  
  181. //Tabelle
  182.  
  183. printf("\n Kanten:\n");
  184. printf("\n            VON            NACH    Gewicht\n");
  185. for(int i = 0; i < anzahl;i++)
  186. {
  187.     printf("%15s %15s %10d \n",kanten[i].knotenA,kanten[i].knotenB,kanten[i].cost);
  188. }
  189.  
  190. printf("\n");
  191.  
  192. //Kruskal
  193.  
  194. printf("The edges of Minimum Cost Spanning Tree are\n");
  195.  
  196. for(int i = 0;i<anzahl;i++)
  197.     {
  198.  
  199.         for(int j = 0;j<anzahl;j++)
  200.         {
  201.  
  202.             if(matrix[i][j]==0)
  203.             {
  204.                 matrix[i][j]=999;
  205.             }
  206.  
  207.         }
  208.         printf("\n");
  209.     }
  210.  
  211. printf("\n");
  212.     printf("              ");
  213.     for(int i = 0;i<anzahl;i++)
  214.     {
  215.         printf("%16s",knoten[i].name);
  216.     }
  217.     printf("\n");
  218.     for(int i = 0;i<anzahl;i++)
  219.     {
  220.         printf("%15s",knoten[i].name);
  221.         for(int j = 0;j<anzahl;j++)
  222.         {
  223.  
  224.             printf("%15d ",matrix[i][j]);
  225.  
  226.         }
  227.         printf("\n");
  228.     }
  229.  
  230. while(ne < anzahl)
  231. {
  232.     for(i=0,min=999;i<anzahl;i++)
  233.     {
  234.         for(j=0;j < anzahl;j++)
  235.         {
  236.             if(matrix[i][j] < min)
  237.             {if (matrix[i][j] >0){
  238.                 min=matrix[i][j];
  239.                 a=u=i;
  240.                 b=v=j;
  241.             }}
  242.         }
  243.     }
  244.     u=find(u);
  245.     v=find(v);
  246.     if(uni(u,v))
  247.     {
  248.         printf("%d edge (%d,%d) =%d\n",ne++,a,b,min);
  249.         mincost +=min;
  250.     }
  251.     matrix[a][b]=matrix[b][a]=999;
  252. }
  253. printf("\n\tMinimum cost = %d\n",mincost);
  254.  
  255.  
  256. }
  257.  
  258. int find(int i)
  259. {
  260.     while(parent[i])
  261.     i=parent[i];
  262.     return i;
  263. }
  264.  
  265. int uni(int i,int j)
  266. {
  267.     if(i!=j)
  268.     {
  269.         parent[j]=i;
  270.         return 1;
  271.     }
  272.         return 0;
  273. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement