Labb 2: Flöden och matchningar
Om du redovisar labben senast den 16 mars får du en
bonuspoäng på tentan.
På övningen 22 februari har du dessutom möjlighet att redogöra för lösningen på teoriuppgifterna nedan. Korrekt lösning av dessa ger en bonuspoäng på tentan. Sen redovisning ger ingen bonus för labb eller teoriuppgifter. Du ska i tre steg skriva ett program som får en bipartit graf som indata och producerar en matchning av maximal storlek som utdata genom att reducera (transformera) matchningsproblemet till flödesproblemet. Korrekthet och effektivitet testas genom att lösningarna på de tre stegen skickas till Kattis, se separata instruktioner. För att klara labben ska du bli godkänd av Kattis på de tre stegen samt redovisa labben för en handledare. Kattis kontrollerar både att programmet gör rätt och att det löser problemet tillräckligt snabbt. Steg 1: Reducera problemet till flödesproblemetDu ska skriva ett program som löser matchningsproblemet med hjälp av en svart låda som löser flödesproblemet. Programmet ska fungera enligt denna översiktliga programstruktur:
Se nedan hur in- och utdataformaten för matchnings- och flödesproblemen ser ut. Ditt program ska lösa problemet effektivt. Kattis kommer att provköra programmet på bipartita grafer på upp till (5000+5000) hörn och upp till 10000 kanter. Kattis känner till problemet som adkreducetoflow. Steg 2: Lös flödesproblemetNu ska du skriva ett program som löser flödesproblemet. Programmet ska läsa indata från standard input och skriva lösningen till standard output. Se nedan hur in- och utdataformaten för flödesproblemet ser ut.Ditt program ska lösa problemet effektivt. Kattis kommer att provköra programmet på generella flödesgrafer på upp till 2000 hörn och 10000 kanter. Kattis känner till problemet som adkmaxflow. Steg 3: Kombinera steg 1 & 2I steg 1 löste du matchningsproblemet med hjälp av en lösning till flödesproblemet. I steg 2 löste du flödesproblemet. Nu ska du kombinera dessa lösningar till ett enda program genom att byta ut kommunikationen av flödesinstansen över standard input och standard output till ett funktionsanrop. Programmet ska fortfarande läsa indata från standard input och skriva lösningen till standard output.Ditt program ska lösa problemet effektivt. Kattis kommer att provköra programmet på bipartita grafer på upp till (5000+5000) hörn och upp till 10000 kanter. Kattis känner till problemet som adkbipmatch. MatchningsproblemetGivet en bipartit graf G = (X,Y,E) finn en maximal matchning. IndataDen första raden består av två heltal som anger antalet hörn i X respektive Y.Den andra raden består av ett tal som anger |E|, det vill säga antalet kanter i grafen. De följande |E| raderna består var och en av två heltal som svarar mot en kant. Hörnen numreras från 1 och uppåt. Om man angett a hörn i X och b hörn i Y så låter vi X = {1, 2,..., a} och Y = {a+1, a+2,..., a+b}. En kant anges med ändpunkterna (först X-hörnet och sedan Y-hörnet). Exempel: En graf kan till exempel kodas så här. 2 3 4 1 3 1 4 2 3 2 5Denna graf har alltså X = {1, 2} och Y = {3, 4, 5}. Kantmängden E innehåller kanterna (1, 3), (1, 4), (2, 3) och (2, 5). UtdataFörst skrivs en rad som är densamma som den första i indata, och därefter en rad med ett heltal som anger antalet kanter i den funna matchningen. Därefter skrivs en rad för varje kant som ingår i matchningen. Kanten beskrivs av ett talpar på samma sätt som i indata. Exempel: Om vi har grafen ovan som indata så kan utdata se ut så här. 2 3 2 1 3 2 5 FlödesproblemetGivet en flödesgraf G = (V,E) finn ett maximalt flöde. Lös flödesproblemet med Edmonds-Karps algoritm, det vill säga Ford-Fulkersons algoritm där den kortaste stigen hittas med breddenförstsökning. Ford-Fulkersons algoritm i pseudokodc[u,v] är kapaciteten från u till v, f[u,v] är flödet, cf[u,v] är restkapaciteten.
for varje kant (u,v) i grafen do
IndataDen första raden består av ett heltal som anger antalet hörn i V.Den andra raden består av två heltal s och t som anger vilka hörn som är källa respektive sänka. Den tredje raden består av ett tal som anger |E|, det vill säga antalet kanter i grafen. De följande |E| raderna består var och en av tre heltal som svarar mot en kant. Hörnen numreras från 1 och uppåt. Om man angett a hörn i V så låter vi V = {1, 2,..., a} En kant anges med ändpunkterna (först från-hörnet och sedan till-hörnet) följt av dess kapacitet. Exempel: En graf kan till exempel kodas så här. 4 1 4 5 1 2 1 1 3 2 2 4 2 3 2 2 3 4 1 Utdata
Den första raden består av ett heltal som anger antalet hörn i V. Exempel: Om vi har grafen ovan som indata så kan utdata se ut så här. 4 1 4 3 5 1 2 1 1 3 2 2 4 2 3 2 1 3 4 1 TestningI katalogen/info/adk07/labb2 ligger programmen
bipgen , flowgen , maxflow , combine och matchtest
som du kan köra för att testa dina program.
Om du inte vet vad tecknen >, < och | betyder i exemplen ovan så
fråga en handledare eller lärare på kursen.
För att kolla hur lång tid ert program kör på era egna testfall kan ni
använda kommandot Teoriuppgifter
|