Opgave 2. De rivier. Je programma s lezen de informatie over de rivier van standard input.

Vergelijkbare documenten
Teamhandleiding DOMjudge (versie 2.2.0muKP) 31 mei 2008

Opgave 1. Woorden en letters

SPOJ oplossingen Gilles Callebaut 7 augustus 2015

Opgave 2. Binaire informatie

DOMjudge teamhandleiding

Universiteit van Amsterdam FNWI. Voorbeeld van tussentoets Inleiding programmeren

Een topprogrammeur in het OO programmeren is Graig Larman. Hij bedacht de volgende zin:

De Leidsche Flesch Studievereniging voor Natuurkunde, Sterrenkunde, Wiskunde en Informatica sinds DLF Pointerworkshop

DOMjudge teamhandleiding

Datastructuren: stapels, rijen en binaire bomen

Online c++ leren programmeren:

Tentamen Imperatief en Object-georiënteerd programmeren in Java voor CKI

public boolean equaldates() post: returns true iff there if the list contains at least two BirthDay objects with the same daynumber

Datastructuren: stapels, rijen en binaire bomen

Opgave 1. Olympische prestaties

Oefeningen Java Oplossingen

public Paneel() { knop = new JButton( Klik ); knop.addactionlistener( new KnopHandler() ); tekstvak = new JTextField(10); add(knop); add(tekstvak);

Modelleren en Programmeren

Hoofdstuk 0. Van Python tot Java.

Modelleren en Programmeren

Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 2 februari 2018, uur

REEKS I. Zaterdag 6 november 2010, 9u

Gegevens invullen in HOOFDLETTERS en LEESBAAR, aub. Belgische Olympiades in de Informatica (duur : maximum 1u15 )

IMP Uitwerking week 13

Uitwerking tentamen Analyse van Algoritmen, 29 januari

DOMjudge teamhandleiding

Voorbeeldtentamen Inleiding programmeren (IN1608WI), Oktober 2003, , Technische Universiteit Delft, Faculteit EWI, Afdeling 2.

Wiskundige Analyse I. Hoofdstuk 1. Vraag 1.1 Het beginvoorwaardenprobleem. x 2 y + xy + x 2 y = 0, y(0+) = 1, y (0+) = 0. bezit een unieke oplossing.

Verslag Opdracht 4: Magische Vierkanten

Programmeermethoden. Arrays (vervolg 2) Walter Kosters. week 9: 6 10 november kosterswa/pm/

Aanvullende toets Gameprogrammeren (INFOB1GP) Woensdag 24 december 2014, uur

Programmeermethoden. Controle-structuren. Walter Kosters. week 3: september kosterswa/pm/

Programmeermethoden. Arrays (vervolg 2) Walter Kosters. week 9: 5 9 november kosterswa/pm/

Technology, Innovation & Society Delft

definities recursieve datastructuren college 13 plaatjes soorten Graph = ( V, E ) V vertices, nodes, objecten, knopen, punten

De eerste ronde Nederlandse Informatica Olympiade

Ingebouwde klassen & methodes


Programmeermethoden. Recursie. week 11: november kosterswa/pm/

Tiende college algoritmiek. 26 april Gretige algoritmen

NAAM: Programmeren 1 Examen 29/08/2012

Algoritmiek. 15 februari Grafen en bomen

Lessen Java: Reeks pag. 1

Modelleren en Programmeren

Uitwerking Tweede deeltentamen Mobiel programmeren - versie 1 Vrijdag 2 februari 2018, uur

Negende college algoritmiek. 15 april Dynamisch Programmeren

Java Les 3 Theorie Herhaal structuren

Programmeermethoden. Arrays. Walter Kosters. week 7: oktober kosterswa/pm/

Arrays. Complexe datastructuren. Waarom arrays. Geen stijlvol programma:

Modelleren en Programmeren

HOGESCHOOL VAN AMSTERDAM Informatica Opleiding. CPP 1 van 10

Programmeermethoden. Functies vervolg. Walter Kosters. week 5: 1 5 oktober kosterswa/pm/


Uitwerkingen derde deeltentamen Gameprogrammeren Vrijdag 6 november 2015, uur

Cursus Algoritmiek najaar 2005

Tweede college algoritmiek. 12 februari Grafen en bomen

ALGORITMIEK: antwoorden werkcollege 5

ALGORITMIEK: antwoorden werkcollege 5

Programmeren (1) Examen NAAM:

C++ programmeermethoden Bachelor Kunstmatige Intelligentie

Datastructuren Werkcollege Intro

Functioneel programmeren

Objectgericht programmeren 1.

Vijfde college algoritmiek. 17 maart Exhaustive search Graafwandelingen Backtracking

public boolean egualdates() post: returns true i f f there i f the l i s t contains at least two BirthDay objects with the same daynumber

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren

3 e jaars GameTech student C++ voor hobby, eerste programmeertaal Assistent bij een heleboel vakken

Vijfde college algoritmiek. 9 maart Brute Force. Exhaustive search

Controle structuren. Keuze. Herhaling. Het if statement. even1.c : testen of getal even of oneven is. statement1 statement2

Derde deeltentamen Gameprogrammeren Vrijdag 7 november 2014, uur

Programmeermethoden. Recursie. Walter Kosters. week 11: november kosterswa/pm/

Tentamen Object Georiënteerd Programmeren TI januari 2013, Afdeling SCT, Faculteit EWI, TU Delft

Tiende college algoritmiek. 14 april Gretige algoritmen

Datastructuren college 10

Kwis (3) class X { public void a() { System.out.println("x"); public static void main(string[] args) { X x = new X();

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, uur

TEST INFORMATICA 1STE BACHELOR IN DE INGENIEURSWETENSCHAPPEN - ACADEMIEJAAR

Game of Life in Java

TENTAMEN Programmeren 1

Overerving & Polymorfisme

De sheets zijn gebaseerd op met name hoofdstuk. D. Bell en M. Parr, Java voor studenten, Prentice Hall,

Vierde college complexiteit. 14 februari Beslissingsbomen

recursie Hoofdstuk 5 Studeeraanwijzingen De studielast van deze leereenheid bedraagt circa 6 uur. Terminologie

Veel succes! 1. Deze opgave bestaat uit een aantal vragen. Houd het antwoord kort: één of twee zinnen per onderdeel kan al genoeg zijn.

Programmeren in Java les 3

Tiende college algoritmiek. 4 mei Gretige Algoritmen Algoritme van Dijkstra

Tentamen Objectgeorienteerd Programmeren IN1205 Voorbeeld

Uitwerkingen Tweede deeltentamen Imperatief programmeren Vrijdag 15 oktober 2010, uur

Elfde college algoritmiek. 18 mei Algoritme van Dijkstra, Heap, Heapify & Heapsort

Modelleren en Programmeren

Uitwerking Tentamen Modelleren en Programmeren - versie 1 Woensdag 1 februari 2017, uur

Vijfde college algoritmiek. 2/3 maart Exhaustive search

Technology, Innovation & Society Delft

REEKS II. Zaterdag 6 november 2010, 11u

Uitgebreide uitwerking Tentamen Complexiteit, mei 2007

Eerste deeltentamen Gameprogrammeren Vrijdag 25 september 2015, uur

Zesde college algoritmiek. 22 maart Backtracking

Vakgroep CW KAHO Sint-Lieven

Transcriptie:

Opgave 2. De rivier In deze opgave gaat het om verbindingen tussen plaatsen die aan weerszijden van een rivier liggen. De plaatsen aan beide kanten van de rivier zijn verbonden met één doorlopende weg. Er zijn enkele bruggen. De geschatte tijdsduur van de verbinding tussen twee aangrenzende plaatsen is bekend. Je programma s lezen de informatie over de rivier van standard input. Op de eerste regel staat een getal L (0 < L < 100) dat aangeeft hoeveel plaatsen er links van de rivier liggen. Deze plaatsen zijn genummerd 1 tot en met L. Op de volgende L-1 regels staan de afstanden van de opvolgende plaatsen, eerst die tussen 1 en 2, dan die tussen 2 en 3, enzovoorts. Op de volgende regel staat een getal R (0 < R < 100) dat aangeeft hoeveel plaatsen er rechts van de rivier liggen. Deze plaatsen zijn genummerd L+1 tot en met L+R. Op de volgende R-1 regels staan de afstanden van de opvolgende plaatsen, eerst die tussen L+1 en L+2, enzovoorts. Op de volgende regel staat een getal B (0 < B < 20) dat aangeeft hoeveel bruggen er zijn tussen beide oevers. Op de laatste B regels staan achtereenvolgens het nummer van een plaats links van de rivier, het nummer van een plaats rechts van de rivier en de afstand bij deze verbinding, gescheiden door spaties. De bruggen worden op volgorde gegeven, beginnend bij de laagst genummerde plaatsen. Bruggen snijden of kruisen elkaar niet. Ze kunnen wel bij dezelfde plaats aankomen of vertrekken; tussen twee plaatsen aan weerszijden van de rivier is maximaal één brug. Alle afstanden in de opgave zijn onderling verschillend; de afstanden zijn positief en geen enkele afstand is groter dan 1000. Voorbeeld invoer bij het plaatje hiernaast: 3 3 plaatsen links 9 Afstand 1-2 16 Afstand 2-3 4 4 plaatsen rechts 4 Afstand 4-5 5 Afstand 5-6 20 Afstand 6-7 2 2 bruggen 2 4 2 Verbinding van 2 naar 4 3 7 30 Verbinding van 3 naar 7 Dit voorbeeld wordt bij alle opgaven als voorbeeldinvoer gebruikt. Tweede ronde NIO, 1 april 2017 Met uitwerkingen / 1 Opgave 2

Overzicht: Opgave Tijdlimiet Testen Per test Totaal 2A 1 10 1 10 2B 1 10 2 20 2C 2 10 3 30 2D 2 10 4 40 2E 2 10 5 50 2F 2 10 5 50 Tweede ronde NIO, 1 april 2017 Met uitwerkingen / 2 Opgave 2

2A: Langs de oevers Schrijf een programma dat een rivier inleest van standard input. Het programma schrijft de lengte van de weg langs de linkeroever en de lengte van de weg langs de rechteroever naar één regel van standard output, gescheiden door een spatie. Uitvoer bij het voorbeeld: 25 29 Oplossing van Erwin van Hunnik in Python 2 (commentaar is weggelaten): OL=int(0) L=int(input("")) L=int(L-1) while int(l)!=0: L=int(L-1) P=int(input("")) OL=int(OL)+int(P) OR=int(0) R=int(input("")) R=int(R-1) while int(r)!=0: R=int(R-1) P=int(input("")) OR=int(OR)+int(P) print(str(ol)+" "+str(or)) 55 van de 68 deelnemers hadden hier de volledige score. Tweede ronde NIO, 1 april 2017 Met uitwerkingen / 3 Opgave 2

2B: Van linksboven naar rechtsonder Schrijf een programma dat een rivier inleest van standard input. Het programma schrijft de lengte van de kortste verbinding van de eerste plaats aan de rechteroever naar de laatste plaats aan de rechteroever, waarbij de rivier maar eenmaal wordt overgestoken, naar één regel van standard output. Uitvoer bij het voorbeeld: 40 Oplossing van Hugo Arkestein in C: #include <stdio.h> #include <stdlib.h> #include <string.h> int main () int i,j; int minafstand=100000000, linkseind, rechtsstart, afstand; int afstandlinks=0,afstandrechts=0; int test, n; int hvll,hvlr; scanf("%d",&hvll); int afstanden[201]; for (i=0;i<hvll-1;i++) scanf("%d",&afstanden[i]); scanf("%d",&hvlr); n=hvlr+hvll; i++; Tweede ronde NIO, 1 april 2017 Met uitwerkingen / 4 Opgave 2

for (;i<n-1;i++) scanf("%d",&afstanden[i]); int aantalbruggen; scanf("%d",&aantalbruggen); int bruglinks[aantalbruggen]; int brugrechts[aantalbruggen]; int bruggenlengte[aantalbruggen]; for (i=0;i<aantalbruggen;i++) scanf("%d %d %d",&bruglinks[i],&brugrechts[i],&bruggenlengte[i]); for (j=0;j<aantalbruggen;j++) afstandlinks=0; afstandrechts=0; linkseind=bruglinks[j]; rechtsstart=brugrechts[j]; for (i=0;i<linkseind-1;i++) afstandlinks+=afstanden[i]; for (i=rechtsstart-1;i<n-1;i++) afstandrechts+=afstanden[i]; afstand=afstandrechts+afstandlinks+bruggenlengte[j]; if (afstand<minafstand) minafstand=afstand; printf("%d",minafstand); /* for (i=0;i< ;i++) for (i=0;i< ;i++) for (j=0;j< ;j++) */ return 0; 25 deelnemers hadden bij deze opgave de volledige score. Tweede ronde NIO, 1 april 2017 Met uitwerkingen / 5 Opgave 2

2C: Nieuwe bruggen Schrijf een programma dat een rivier inleest van standard input. Het programma zoekt uit hoeveel extra bruggen kunnen worden gemaakt. Daarbij mag er tussen de beide plaatsen aan weerszijden van de brug nog geen andere brug lopen. Een nieuwe brug mag geen bestaande brug snijden of kruisen. Het programma telt het aantal mogelijke nieuwe bruggen en schrijft dat aantal naar één regel van standard output. Uitvoer bij het voorbeeld: 4 Toelichting: Er zijn ook andere manieren denkbaar om de bruggen aan te leggen, maar meer dan vier bruggen bijbouwen zal nooit lukken. Tweede ronde NIO, 1 april 2017 Met uitwerkingen / 6 Opgave 2

Oplossing: Je kunt bewijzen dat het aantal bruggen dat je maximaal kunt hebben tussen N en M plaatsen op beide oevers altijd N+M-1 is. Het antwoord op 2C is dan ook N+M-B-1. Voor de liefhebbers: Dat kun je laten zien met de methode van volledige inductie. Zie voor een toelichting daarop bijvoorbeeld http://www.wiskundeleraar.nl/page3.asp?nummer=12272 Stap 1. Het maximale aantal bruggen tussen 1 plaats links en M plaatsen rechts is M. Dat ligt voor de hand; iedere plaats rechts kun je verbinden met de ene plaats links, dus je hebt M bruggen. Stap 2. Neem aan dat het maximale aantal bruggen tussen N plaatsen links en M plaatsen rechts N+M-1 is. Dit noemen we de inductieveronderstelling. Je gaat dadelijk verder redeneren in de veronderstelling dat dit klopt. Stap 3. Bekijk nu de situatie dat je 1 plaats toevoegt aan de linkeroever, terwijl er al een maximaal aantal bruggen ligt. Die ene plaats ligt bijvoorbeeld aan het einde van de linkeroever. Dan kun je altijd een brug toevoegen naar de laatste plaats aan de rechteroever. Meer mogelijkheden zijn er niet, want als er bij die laatste plaats nog geen brug aan zou komen, was niet het maximaal aantal bruggen gebruikt. Je kunt dus één brug toevoegen. Als de ene plaats extra links tussen twee bestaande plaatsen komt, dan gaan de bruggen van de beide buurplaatsen naar dezelfde plaats aan de overkant. Als dat niet zo zou zijn, had er nog een brug bij gekund, maar het maximale aantal bruggen was al gebruikt. Dus kan ik precies één brug toevoegen, die naar dezelfde plaats aan de overkant gaat als de bruggen van de buren. Conclusie: De bewering dat het aantal bruggen van N plaatsen links naar M plaatsen rechts maximaal N+M-1 is is waar. In stap 1 hebben we gezien dat het waar is voor N=0. De combinatie van stap 1 en de aanname van stap 2 geeft via stap 3 dat het dan ook waar is voor N=1. Daarna kun je stap 2 en 3 blijven combineren, zodat je het voor iedere N kun bewijzen. Tweede ronde NIO, 1 april 2017 Met uitwerkingen / 7 Opgave 2

Er waren 11 deelnemers met een volledige score. De eerste die met een oplossing kwam was Siebe Verheijen. Hier zijn programma in Java: import java.util.arraylist; import java.util.scanner; public class eenalpha public static void main (String[] args) /** * Array = Object[] = Deze haakjes * ArrayList = List<Object> = list.get(nummer vanaf 0) */ Scanner s = new Scanner(System.in); int L = Integer.parseInt(s.nextLine()); for (int i=1; i<=l-1; i=i+1) int t = Integer.parseInt(s.nextLine()); int R = Integer.parseInt(s.nextLine()); for (int i=1; i<=r-1; i=i+1) int t = Integer.parseInt(s.nextLine()); int B = Integer.parseInt(s.nextLine()); System.out.println(R+L-B-1); Tweede ronde NIO, 1 april 2017 Met uitwerkingen / 8 Opgave 2

2D: Niemands naaste buur De naaste buur van een plaats is de plaats die er het dichtst bij ligt. In het voorbeeld: de plaatsen 2 en 4 zijn elkaars naaste buur, 2 is ook de naaste buur van 1, maar 1 is niet de naaste buur van 2 (dat is 4 namelijk al). Schrijf een programma dat een rivier inleest van standard input. Het programma schrijft naar standard output eerst een regel met een getal N, dat aangeeft dat er N plaatsen zijn die van niemand de naaste buur zijn. Vervolgens komen er N regels met de plaatsen die van niemand naaste buur zijn, oplopend geordend. Uitvoer bij het voorbeeld: 3 1 3 7 Toelichting: Plaats 1 heeft als naaste buur plaats 2 met afstand 9 Plaats 2 heeft als naaste buur plaats 4 met afstand 2 Plaats 3 heeft als naaste buur plaats 2 met afstand 16 Plaats 4 heeft als naaste buur plaats 2 met afstand 2 Plaats 5 heeft als naaste buur plaats 4 met afstand 4 Plaats 6 heeft als naaste buur plaats 5 met afstand 5 Plaats 7 heeft als naaste buur plaats 6 met afstand 20 Geen enkele plaats heeft plaats 1, 3 of 7 als naaste buur. Oplossing van Tom Udding in PHP: <?php $plaatsenlinks = $plaatsenrechts = $aantalbruggen = $afstand = 0; $plaatslinks = $plaatsrechts = 0; $afstandenlinks = $afstandenrechts = array(); $totaal = array(); $bruggen = array(); $buren = array(); fscanf(stdin, "%d\n", $plaatsenlinks); for ($i = 0; $i < ($plaatsenlinks - 1); $i++) fscanf(stdin, "%d\n", $afstand); array_push($afstandenlinks, array("van" => $i+1, "naar" => $i+2, "afstand" => $afstand)); array_push($totaal, array("van" => $i+1, "naar" => $i+2, "afstand" => $afstand)); Tweede ronde NIO, 1 april 2017 Met uitwerkingen / 9 Opgave 2

fscanf(stdin, "%d\n", $plaatsenrechts); for ($i = 0; $i < ($plaatsenrechts - 1); $i++) fscanf(stdin, "%d\n", $afstand); array_push($afstandenrechts, array("van" => $i+$plaatsenlinks+1, "naar" => $i+$plaatsenlinks+2, "afstand" => $afstand)); array_push($totaal, array("van" => $i+$plaatsenlinks+1, "naar" => $i+$plaatsenlinks+2, "afstand" => $afstand)); fscanf(stdin, "%d\n", $aantalbruggen); for ($i = 0; $i < $aantalbruggen; $i++) fscanf(stdin, "%d %d %d\n", $plaatslinks, $plaatsrechts, $afstand); array_push($bruggen, array("van" => $plaatslinks, "naar" => $plaatsrechts, "afstand" => $afstand)); array_push($totaal, array("van" => $plaatslinks, "naar" => $plaatsrechts, "afstand" => $afstand)); //print_r($afstandenlinks); //print_r($afstandenrechts); //print_r($bruggen); //print_r($totaal); $dorpen = array(); $dorpen2 = array(); for ($i = 0; $i < ($plaatsenlinks + $plaatsenrechts); $i++) $temp = array(); foreach ($totaal as $plaats) if ($plaats['van'] == ($i+1)) $temp[$plaats['naar']] = $plaats['afstand']; else if ($plaats['naar'] == ($i+1)) $temp[$plaats['van']] = $plaats['afstand']; $afstand = min($temp); $dorpen[] = array_search($afstand, $temp); //echo "Plaats ".($i+1)." heeft als naaste buur $dorp met afstand $afstand\n"; for ($i = 1; $i <= ($plaatsenlinks + $plaatsenrechts); $i++) $dorpen2[] = $i; $output = array(); for ($i = 1; $i <= ($plaatsenlinks + $plaatsenrechts); $i++) if (!in_array($i, $dorpen)) $output[] = $i; Tweede ronde NIO, 1 april 2017 Met uitwerkingen / 10 Opgave 2

echo count($output)."\n"; foreach ($output as $out) echo $out."\n";?> Er waren 21 deelnemers met een volledige oplossing. Tweede ronde NIO, 1 april 2017 Met uitwerkingen / 11 Opgave 2

2E: Grootste wegafsluiting Schrijf een programma dat een rivier inleest van standard input. Het programma zoekt naar de wegen die langs beide oevers kunnen worden afgesloten voor onderhoud, zodat alle plaatsen wel onderling verbonden blijven. De bruggen worden niet afgesloten. Je programma berekent de som van de verbindingstijden langs de afgesloten wegdelen en schrijft die som naar standard output. Uitvoer bij het voorbeeld: 20 Toelichting: Als je de weg tussen 6 en 7 weglaat kun je nog steeds overal komen. Als je nog een weg schrapt is er minstens één plaats onbereikbaar geworden vanuit andere plaatsen. Oplossing van Andor Michels in C++: #include<iostream> using namespace std; int L; int* afstandenl; int R; int* afstandenr; int B; int* bruggen; int* bruggenl; int* bruggenr; int main() cin >> L; afstandenl = new int[l-1]; for (int i = 0; i < L-1; i++) Tweede ronde NIO, 1 april 2017 Met uitwerkingen / 12 Opgave 2

cin >> afstandenl[i]; cin >> R; afstandenr = new int[r-1]; for (int i = 0; i < R-1; i++) cin >> afstandenr[i]; cin >> B; bruggen = new int[b]; bruggenl = new int[b]; bruggenr = new int[b]; for (int i = 0; i < B; i++) cin >> bruggenl[i] >> bruggenr[i] >> bruggen[i]; //logic int maxa = 0; for (int i = 1; i < B; i++) int maxweg = 0; for (int j = bruggenl[i-1]-1; j < bruggenl[i]-1; j++) maxweg = max(maxweg, afstandenl[j]); for (int j = bruggenr[i-1]-1-l; j < bruggenr[i]-1-l; j++) maxweg = max(maxweg, afstandenr[j]); maxa += maxweg; cout << maxa; return 0; Christel van Diepen, Arend Mellendijk, Reijer van Harten, Ernest van Wijland, Wietze Koops en Andor Michels hadden een correcte oplossing. Een mooie manier om dit probleem op te lossen is het algoritme van Kruskal. Zie bijvoorbeeld https://nl.wikipedia.org/wiki/kruskals_algoritme Tweede ronde NIO, 1 april 2017 Met uitwerkingen / 13 Opgave 2

2F: Centrum Schrijf een programma dat een rivier inleest van standard input. Het programma schrijft het nummer van de plaats die de kleinste maximale afstand heeft naar alle andere plaatsen naar één regel van standard output. Als dat kleinste maximum voor verschillende plaatsen hetzelfde is, voert je programma het laagste plaatsnummer uit. Uitvoer bij het voorbeeld: 5 Toelichting: Vanaf plaats 1 is plaats 7 het verst weg, afstand 40 Vanaf plaats 2 is plaats 7 het verst weg, afstand 31 Vanaf plaats 3 is plaats 7 het verst weg, afstand 30 Vanaf plaats 4 is plaats 7 het verst weg, afstand 29 Vanaf plaats 5 is plaats 7 het verst weg, afstand 25 Vanaf plaats 6 is plaats 3 het verst weg, afstand 27 Vanaf plaats 7 is plaats 1 het verst weg, afstand 40 Oplossing van Christel van Diepen in C++: #include <iostream> #include <string> using namespace std; int L, R, B; int dist[200][200]; int mindis[200]; bool naast[200]; bool justdone[200]; Tweede ronde NIO, 1 april 2017 Met uitwerkingen / 14 Opgave 2

int dis[200]; void rdinput() int i = 1; cin >> L; for (i = 1; i < L; i++) cin >> dist[i][i+1]; dist[i+1][i] = dist[i][i+1]; cin >> R; for (i = L + 1 ; i < R + L; i++) cin >> dist[i][i+1]; dist[i+1][i] = dist[i][i+1]; cin >> B; for (int j = 0; j < B; j++) int x, y; cin >> x >> y; cin >> dist[x][y]; dist[y][x] = dist[x][y]; void A() long l = 0, r = 0; for (int i = 1; i < L; i++) l += dist[i][i+1]; for (int i = L + 1; i < R + L; i++) r += dist[i][i+1]; cout << l << ' ' << r; void Bee() for (int i = 1; i <= L + R; i++) for (int j = i + 1; j <= L + R; j++) if (dist[i][j]!= 0) if (mindis[j] == 0) mindis[j] = mindis[i] + dist[i][j]; else mindis[j] = min(mindis[j], mindis[i] + dist[i][j]); cout << mindis[l+r]; int nst(int n) int d = 1001; Tweede ronde NIO, 1 april 2017 Met uitwerkingen / 15 Opgave 2

int di = 0; for (int i = 1; i <= L + R; i++) if (dist[i][n]!= 0 && dist[i][n] < d) d = dist[i][n]; di = i; return di; void D() for (int i = 1; i <= L + R; i++) naast[nst(i)] = true; int c = 0; for (int i = 1; i <= L + R; i++) if (!naast[i]) c++; cout << c << endl; for (int i = 1; i <= L + R; i++) if (!naast[i]) cout << i << endl; int maxdis(int n) for (int i = 0; i <= L + R; i++) dis[i] = 0; justdone[n] = true; int maxd = 0; int jd = 0; do jd = 0; for (int i = 1; i <= L + R; i++) if (justdone[i]) for (int j = 1; j <= L + R; j++) //if (n == 2) cerr << i << ' ' << j << endl; if (dist[i][j]!= 0 && j!= n && (dis[j] == 0 (dist[i][j] + dis[i] < dis[j]))) dis[j] = dist[i][j] + dis[i]; justdone[j] = true; jd++; justdone[i] = false; while (jd > 0); for (int i = 1; i <= L + R; i++) //if (n == 2) cerr << i << ' ' << dis[i] << endl; maxd = max(maxd, dis[i]); return maxd; Tweede ronde NIO, 1 april 2017 Met uitwerkingen / 16 Opgave 2

void F() int c = 1; int m = maxdis(1); for (int i = 2; i <= L + R; i++) //cerr << c << ' ' << m << endl; int ma = maxdis(i); //cerr << i << ' ' << ma << endl; if (ma < m) //cerr << i << ' ' << ma << endl; c = i; m = ma; cout << c; int main() rdinput(); F(); return 0; Christel van Diepen, Jelmer Hinssen, Ernest van Wijland en Alex Keizer hebben de volledige score behaald voor deze deelopgave. Deze opgave kun je oplossen door gebruikt te maken van het algoritme van Dijkstra, een beroemde Nederlandse bijdrage aan de informatica. Zie bijvoorbeeld de beschrijving op http://www.wiskundemeisjes.nl/20090420/ode-aan-dijkstra/ Tweede ronde NIO, 1 april 2017 Met uitwerkingen / 17 Opgave 2