Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2019
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.52 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<conio.h>
  4. #include <string.h>
  5. #define MAX 30
  6.  
  7.  
  8. typedef struct kante
  9. {
  10.     char knotenA[15];
  11.     char knotenB[15];
  12.     int pos_A;
  13.     int pos_B;
  14.     int cost;
  15. }KANTE;
  16.  
  17. typedef struct KLIST
  18. {
  19.     KANTE data[MAX]; //Liste mit den eingegebenen Kanten
  20.     int n;           //Länge der Liste
  21. }KLIST;
  22.  
  23. KLIST klist;         //Kantenliste
  24.  
  25. int matrix[MAX][MAX],anzahl;
  26. KLIST spanlist;      //Spannbaum Liste
  27. void kruskal();
  28. int find(int parent[],int position);
  29. void union1(int parent[],int c1,int c2);
  30. void sort();
  31. void print();
  32. char knoten[15][MAX]; //Namensspeicher Knoten
  33. int tree; //
  34. int main()
  35. {
  36.     //int anzahl;
  37.  
  38.  
  39.  
  40.     printf("Kruskal Algorithmus\n\n");
  41.     int repeat = 1;
  42.     //Auswahl maximaler oder minimaler Spannbaum
  43.     while(repeat == 1){
  44.         printf("Wollen Sie einen maximalen oder minimalen Spannbaum verwenden?\n");
  45.         printf("Eingabe: 1 -> maximaler Spannbaum\n");
  46.         printf("Eingabe: 2 -> minimaler Spannbaum\n");
  47.         scanf("%d",&tree);
  48.  
  49.         if(tree == 1 || tree == 2)
  50.         {
  51.             repeat = 0;
  52.         }
  53.         else
  54.         {
  55.             printf("Eingabe nicht erkannt!\n");
  56.             fflush(stdin);
  57.         }
  58.  
  59.     }
  60.     repeat = 1;
  61.     //Einlesen der Knotennamen
  62.     while(repeat == 1){
  63.         printf("Bitte geben Sie die Anzahl der Knoten ein (maximal 30)\n");
  64.         scanf("%d",&anzahl);
  65.         if(anzahl < MAX && anzahl > 0)
  66.         {
  67.             repeat = 0;
  68.         }
  69.         else
  70.         {
  71.             printf("Eingabe nicht akzeptiert\n");
  72.         }
  73.         fflush(stdin);
  74.  
  75.     }
  76.  
  77.     for(int i = 0;i<anzahl;i++)
  78.     {
  79.         printf("\nKnoten %d\n",i);
  80.         printf("**********\n");
  81.         printf("Geben Sie einen Namen ein(15 Zeichen): ");
  82.         scanf("%s",&knoten[i]);
  83.     }
  84.  
  85.  
  86.     //Einlesen der Kanten
  87.     //int matrix[anzahl][anzahl];
  88.  
  89.     int count_kanten = 0;//Zählt Anzahl der Eingebenen Kanten
  90.  
  91.     //Durchlauf der Matrix und Speicherung der Wegkosten
  92.     for(int i = 0;i<anzahl;i++)
  93.     {
  94.         for(int j = 0;j<anzahl;j++)
  95.         {
  96.             if(j > i){
  97.                 repeat = 1;
  98.                 while(repeat == 1)
  99.                 {
  100.                     printf("\nWenn keine Kante/Verbindung -> 0 eingeben\n");
  101.                     printf("Bitte Abstand/Kosten eingeben fuer:  %s nach %s\n",knoten[i],knoten[j]);
  102.                     scanf("%d",&matrix[i][j]);
  103.                     if(matrix[i][j] < 32000 && matrix[i][j] > -32000  )
  104.                     {
  105.                         repeat = 0;
  106.                     }
  107.                     else
  108.                     {
  109.                         printf("Eingabe nicht akzeptiert\n");
  110.                     }
  111.                     fflush(stdin);
  112.                 }
  113.                 if(matrix[i][j] != 0)
  114.                 {
  115.                     count_kanten = count_kanten + 1;
  116.                 }
  117.             }
  118.             //Wenn Knoten auf sich selbst zeigt kosten = 0
  119.             if(j == i)
  120.             {
  121.                 matrix[i][j] = 0;
  122.             }
  123.  
  124.         }
  125.  
  126.     }
  127.  
  128.     //Speicherung der Kanten in der Struktur Kanten mit Namen/Position/Wegkosten
  129.     KANTE kanten[count_kanten];
  130.     int k = 0;
  131.  
  132.     for(int i = 0;i< anzahl;i++)
  133.     {
  134.         for(int j = 0; j < anzahl;j++)
  135.         {
  136.             if(i < j && matrix[i][j] != 0)
  137.             {
  138.                     strcpy(kanten[k].knotenA,knoten[i]);
  139.                     strcpy(kanten[k].knotenB,knoten[j]);
  140.                     kanten[k].pos_A = i;
  141.                     kanten[k].pos_B = j;
  142.                     kanten[k].cost = matrix[i][j];
  143.                     k = k + 1;
  144.             }
  145.         }
  146.     }
  147.  
  148.  
  149.     //Kopieren der eingebenen Werte in die hälfte unter der Diagonale in der Matrix
  150.     for(int i = 0;i<anzahl;i++)
  151.     {
  152.         for(int j = 0;j<anzahl;j++)
  153.         {
  154.             if(j < i)
  155.             {
  156.                 matrix[i][j] = matrix[j][i];
  157.             }
  158.  
  159.         }
  160.  
  161.     }
  162.     printf("\n");
  163.    //Bubblesort :) Sortieren nach gewicht
  164.    for (int i = 1; i < count_kanten ; i++)
  165.    {
  166.       for (int j = 0; j < count_kanten - i ; j++)
  167.       {
  168.           if (kanten[j].cost > kanten[j+1].cost)
  169.           {
  170.               KANTE temp = kanten[j];
  171.               kanten[j] = kanten[j+1];
  172.               kanten[j+1] = temp;
  173.           }
  174.       }
  175.    }
  176.  
  177.  
  178. //Ausgabe der Matrix
  179. printf("\n");
  180. printf("              ");
  181. //Ausgabe der Knotennamen überhalb der Matrix
  182. for(int i = 0;i<anzahl;i++)
  183. {
  184.     printf("%16s",knoten[i]);
  185. }
  186. printf("\n");
  187.  
  188. for(int i = 0;i<anzahl;i++)
  189. {
  190.  
  191.         printf("%15s",knoten[i]);//Ausgabe der Namen am Zeilanfang
  192.         for(int j = 0;j<anzahl;j++)
  193.         {
  194.  
  195.             printf("%15d ",matrix[i][j]);//Ausgabe der Matrix
  196.  
  197.         }
  198.         printf("\n");
  199.     }
  200.  
  201.  
  202.  
  203. //Tabelle mit nach kosten sortierten Kanten
  204. printf("\nKanten:");
  205. printf("\nRANG             VON            NACH    GEWICHT     SPALTE      ZEILE\n");
  206. for(int i = 0; i < k;i++)
  207. {
  208.     printf("%4d %15s %15s %10d %10d %10d\n",i,kanten[i].knotenA,kanten[i].knotenB,kanten[i].cost,kanten[i].pos_A,kanten[i].pos_B);
  209. }
  210.  
  211. printf("\n");
  212.  
  213. //Aufruf Kruskal Algorithmus
  214. kruskal();
  215. //Ausgabe der Ergebnisse
  216. print();
  217. }
  218. //Funktionen
  219. void kruskal()
  220. {
  221.     int parent[MAX],i,j,cno1,cno2;
  222.     klist.n=0;
  223.  
  224.     for(i=1;i<anzahl;i++)
  225.         for(j=0;j<i;j++)
  226.         {
  227.             if(matrix[i][j]!=0)
  228.             {
  229.                 //Speicher der Position und Kosten der Kanten in einer Liste. n zählt die Länge der Liste
  230.                 klist.data[klist.n].pos_A=i;
  231.                 klist.data[klist.n].pos_B=j;
  232.                 klist.data[klist.n].cost=matrix[i][j];
  233.                 klist.n++;
  234.             }
  235.         }
  236.     //Sortiert die Liste mit Kanten
  237.     sort();
  238.     //Befüllt Parent Array
  239.     for(i=0;i<anzahl;i++)
  240.     {
  241.         parent[i]=i;
  242.     }
  243.  
  244.     spanlist.n=0;
  245.  
  246.     for(i=0;i<klist.n;i++)
  247.     {
  248.  
  249.         //Überprüft ob beide Kanten den gleichen Parent haben
  250.         cno1=find(parent,klist.data[i].pos_A);
  251.         cno2=find(parent,klist.data[i].pos_B);
  252.         //Wenn nicht gleicher Parent werden werte aus der kanten liste in der Spannbaumliste gespeichert
  253.         if(cno1!=cno2)
  254.         {
  255.             spanlist.data[spanlist.n]=klist.data[i];
  256.             spanlist.n=spanlist.n+1;//index in der Spannbaumliste
  257.             union1(parent,cno1,cno2);
  258.         }
  259.     }
  260. }
  261.  
  262. int find(int parent[],int position)
  263. {
  264.     return(parent[position]);//Such Wert im Array Parent an der übergebenen Position
  265. }
  266.  
  267. //Weist beiden Knoten den gleichen Parent zu
  268. void union1(int parent[],int c1,int c2)
  269. {
  270.     for(int i=0;i<anzahl;i++)
  271.     {
  272.         if(parent[i]==c2)
  273.         {
  274.             parent[i]=c1;
  275.         }
  276.     }
  277. }
  278.  
  279. void sort()
  280. {
  281.     int i,j;
  282.     KANTE temp;
  283.     //Für max Spannbaum
  284.     //Kosten der Kanten weerden negiert
  285.     if(tree == 1)
  286.     {
  287.  
  288.         for(int i = 0;i < klist.n;i++)
  289.         {
  290.             klist.data[i].cost = (klist.data[i].cost * (-1));
  291.         }
  292.     }
  293.     //Elemente in der kantenliste werden nach kosten sortiert
  294.     for(i=1;i<klist.n;i++)
  295.         for(j=0;j<klist.n-1;j++)
  296.             if(klist.data[j].cost>klist.data[j+1].cost)
  297.             {
  298.                 temp=klist.data[j];
  299.                 klist.data[j]=klist.data[j+1];
  300.                 klist.data[j+1]=temp;
  301.             }
  302.     //Für max Spannbaum
  303.     // Kosten der Kanten werden wieder negiert
  304.     if(tree == 1)
  305.     {
  306.         for(int i = 0;i < klist.n;i++)
  307.         {
  308.             klist.data[i].cost = (klist.data[i].cost * (-1));
  309.         }
  310.     }
  311. }
  312. //Ausgabe der Ergebnisse
  313. void print()
  314. {
  315.     int i,cost=0;
  316.  
  317.     for(i=0;i<spanlist.n;i++)
  318.     {
  319.  
  320.         printf("\nKante: %s <--> %s kosten:%d",knoten[spanlist.data[i].pos_B],knoten[spanlist.data[i].pos_A],spanlist.data[i].cost);
  321.         cost=cost+spanlist.data[i].cost;
  322.     }
  323.  
  324.     printf("\n\nKosten des Spannbaums = %d",cost);
  325. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement