6c. MST: eerste volledig werkend programma

2021-02-22
slides.com/jod/pt_6c

Docent: Jo Devriendt

Assistent: Ann Philips

Coördinator: Joost Vennekens

voornaam.achternaam@kuleuven.be

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Resultaat eerste programma

5
-1  9  2 -1  6
 9 -1 -1  4  8
 2 -1 -1  7  5
-1  4  7 -1  3
 6  8  5  3 -1
  • Datastructuren
  • I/O procedures
  • Arbitraire keuze van n-1 takken
  • Berekening totaal gewicht
2

5

1

3

2

4

9
4
7
3
5
6
8
1 -> 2 : 9
1 -> 3 : 2
1 -> 4 : 10000
1 -> 5 : 6
10017

Vervangen door zo eenvoudig mogelijke procedure die een minimum spanning tree (MST) berekent

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Nuttige stelling

2
9
4
7
3
5
6
8

5

1

3

2

4

Gegeven een deel van de MST, dan behoort de
boog met laagste gewicht die vanuit de deel-MST vertrekt en toekomt buiten de deel-MST, ook tot de MST.

  • Rood: deel-MST
  • Blauw: buiten deel-MST
  • Violet (gestreept): bogen tussen deel-MST en erbuiten
2

5

1

3

2

4

9
4
7
3
5
6
8

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Constructief algoritme

  1. Hou deel-MST bij
    • Elke individuele knoop is een geldige deel-MST om mee te beginnen
  2. Zoek violette boog met kleinste gewicht
  3. Voeg toe aan deel-MST
  4. Itereer tot alle knopen tot de MST behoren
2
9
4
7
3
5
6
8

5

1

3

2

4

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Constructief algoritme

  1. Hou deel-MST bij
    • Elke individuele knoop is een geldige deel-MST om mee te beginnen
  2. Zoek violette boog met kleinste gewicht
  3. Voeg toe aan deel-MST
  4. Itereer tot alle knopen tot de MST behoren
2
9
4
7
3
5
6
8

5

1

3

2

4

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Constructief algoritme

  1. Hou deel-MST bij
    • Elke individuele knoop is een geldige deel-MST om mee te beginnen
  2. Zoek violette boog met kleinste gewicht
  3. Voeg toe aan deel-MST
  4. Itereer tot alle knopen tot de MST behoren
2
9
4
7
3
5
6
8

5

1

3

2

4

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Constructief algoritme

  1. Hou deel-MST bij
    • Elke individuele knoop is een geldige deel-MST om mee te beginnen
  2. Zoek violette boog met kleinste gewicht
  3. Voeg toe aan deel-MST
  4. Itereer tot alle knopen tot de MST behoren
2
9
4
7
3
5
6
8

5

1

3

2

4

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Constructief algoritme

  1. Hou deel-MST bij
    • Elke individuele knoop is een geldige deel-MST om mee te beginnen
  2. Zoek violette boog met kleinste gewicht
  3. Voeg toe aan deel-MST
  4. Itereer tot alle knopen tot de MST behoren
2
9
4
7
3
5
6
8

5

1

3

2

4

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Constructief algoritme

  1. Hou deel-MST bij
    • Elke individuele knoop is een geldige deel-MST om mee te beginnen
  2. Zoek violette boog met kleinste gewicht
  3. Voeg toe aan deel-MST
  4. Itereer tot alle knopen tot de MST behoren
2
9
4
7
3
5
6
8

5

1

3

2

4

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Constructief algoritme

  1. Hou deel-MST bij
    • Elke individuele knoop is een geldige deel-MST om mee te beginnen
  2. Zoek violette boog met kleinste gewicht
  3. Voeg toe aan deel-MST
  4. Itereer tot alle knopen tot de MST behoren
2
9
4
7
3
5
6
8

5

1

3

2

4

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Constructief algoritme

  1. Hou deel-MST bij
    • Elke individuele knoop is een geldige deel-MST om mee te beginnen
  2. Zoek violette boog met kleinste gewicht
  3. Voeg toe aan deel-MST
  4. Itereer tot alle knopen tot de MST behoren
2
9
4
7
3
5
6
8

5

1

3

2

4

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Constructief algoritme

  1. Hou deel-MST bij
    • Elke individuele knoop is een geldige deel-MST om mee te beginnen
  2. Zoek violette boog met kleinste gewicht
  3. Voeg toe aan deel-MST
  4. Itereer tot alle knopen tot de MST behoren
2
9
4
7
3
5
6
8

5

1

3

2

4

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Constructief algoritme

  1. Hou deel-MST bij
    • Elke individuele knoop is een geldige deel-MST om mee te beginnen
  2. Zoek violette boog met kleinste gewicht
  3. Voeg toe aan deel-MST
  4. Itereer tot alle knopen tot de MST behoren
2
9
4
7
3
5
6
8

5

1

3

2

4

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Constructief algoritme

Hoe te coderen?

void main(int argc, char* argv[]){
  int n;
  int afstand[NMAX][NMAX];
  int len;
  Tak opl[NMAX];
  
  n = leesGraaf(afstand);
  simpelMst(afstand,opl,n);
  len = totaalGewicht(opl,n);
  drukGraaf(opl,n,len);
}
void main(int argc, char* argv[]){
  int n;
  int afstand[NMAX][NMAX];
  int len;
  Tak opl[NMAX];
  
  n = leesGraaf(afstand);
  kiesArbitrair(afstand,opl,n);
  len = totaalGewicht(opl,n);
  drukGraaf(opl,n,len);
}

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Hoe te coderen?

Procedures:
- simpelMst
- kleinsteViolet
- isViolet

void simpelMst(int afstand[][NMAX], Tak opl[], int n){
  char kleur[NMAX]; // 'r' is rood, 'b' blauw
  
  kleur[0]='r';
  for(int i=1; i<n; ++i){
    kleur[i]='b';
  }
  
  for(int i=0; i<n-1; ++i){
    opl[i]=kleinsteViolet(afstand,n,kleur);
    kleur[opl[i].van]='r';
    kleur[opl[i].naar]='r';
  }
}

Datastructuur: lijst met kleur van knopen

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Hoe te coderen?

int isViolet(int x, int y, char kleur[]){
  return kleur[x]!=kleur[y];
}

Tak kleinsteViolet(int afstand[][NMAX],int n,char kleur[]){
  Tak kleinste = {-1,-1,ZEERGROOT+1};
  for(int i=0; i<n; ++i){
    for(int j=i+1; j<n; ++j){
      if(isViolet(i,j,kleur)
          && kleinste.gewicht>afstand[i][j]){
        kleinste.van=i;
        kleinste.naar=j;
        kleinste.gewicht = afstand[i][j];
      }
    }
  }
  return kleinste;
}

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Wat met onbestaande bogen?

Voorlopig: onbestaande bogen krijgen "zeer groot" gewicht, en worden voor de rest behandeld als gewone bogen

Werkt perfect: zal enkel een kleinste violette boog zijn indien graaf niet samenhangend is (niet alles kan verbonden worden).

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Resultaat tweede programma

5
-1  9  2 -1  6
 9 -1 -1  4  8
 2 -1 -1  7  5
-1  4  7 -1  3
 6  8  5  3 -1

Werkende code met nog meeste code van eerste programma :)

2

5

1

3

2

4

9
4
7
3
5
6
8
0 -> 2 : 2
2 -> 4 : 5
3 -> 4 : 3
1 -> 3 : 4
14
2
9
4
7
3
5
6
8

5

1

3

2

4

Made with Slides.com