Jun
27
2008

Die Gedanken kreisen

LabyrinthAktuell bin ich wieder am Programmieren für meine Diplomarbeit. Dabei geht es um einen Prozess mit kreisfreien Graphen. Das ist kein gerichtliches Verfahren von unabhängigen Adligen, sondern die zufällige Entwicklung einer gewissen Menge von Objekten. In diesem Fall sind die Objekte Graphen, die keinen Kreis der Länge fünf (ein Kreis auf fünf Knoten) enthalten. Zwischen diesen Graphen springt man nun zufällig hin und her, indem jeweils eine Kante hinzugefügt oder weggenommen wird. Dabei muss der Graph natürlich kreisfrei bleiben. Um das zu testen, habe ich folgenden Code geschrieben. (edge(graph,ii,jj) liefert 1, wenn eine Kante zwischen Knoten ii und Knoten jj liegt, sonst 0.)
Die Laufzeit ist von Ordnung O(n³). Es würde mir sehr weiterhelfen, wenn man das verbessern könnte. Ideen?
Den Code findet ihr hier:

int checkchangedgraphC5(grph graph, edge e)
{
/* accepts a formerly C5-free graph with one changed edge an searches for induced C5 */
/* returns 1 if induced C5 is found */
int ii = 0,jj = 0,kk = 0;
/* printf("Checking for induced C5"); */
if (edge(graph,e.v,e.w))
{ /* edge was set */
while(ii < order(graph))
{
if ((ii == e.v) || (ii == e.w)){ ii++; continue; }
if (!edge(graph,e.v,ii) || edge(graph,e.w,ii)){ ii++; continue; }
while(jj < order(graph))
{
if((jj == e.v) || (jj == e.w) || (jj == ii)){ jj++; continue; }
if(!edge(graph,e.w,jj) || edge(graph,e.v,jj) || edge(graph,ii,jj)){ jj++; continue;}
while(kk < order(graph))
{
if((kk == e.v) || (kk == e.w) || (kk == ii) || (kk == jj)){ kk++; continue; }
if (edge(graph,ii,kk) && edge(graph,jj,kk) && !edge(graph,e.v,kk) && !edge(graph,e.w,kk))
{
return 1;
}
kk++;
}
kk = 0;
jj++;
}
jj = 0;
ii++;
}
}
else
{ /* edge was cleared */
while(ii < order(graph))
{
if ((ii == e.v) || (ii == e.w)){ ii++; continue; }
if (!edge(graph,e.v,ii) || edge(graph,e.w,ii)){ ii++; continue; }
while(jj < order(graph))
{
if((jj == e.v) || (jj == e.w) || (jj == ii)){ jj++; continue; }
if(!edge(graph,e.w,jj) || edge(graph,e.v,jj) || !edge(graph,ii,jj)){ jj++; continue;}
while(kk < order(graph))
{
if((kk == e.v) || (kk == e.w) || (kk == ii) || (kk == jj)){ kk++; continue; }
if (!edge(graph,ii,kk) && !edge(graph,jj,kk) && edge(graph,e.v,kk) && edge(graph,e.w,kk))
{
return 1;
}
kk++;
}
kk = 0;
jj++;
}
jj = 0;
ii++;
}
}
return 0;
}

Written by Andi in: Angetestet,Uni | Schlagwörter: ,

Keine Kommentare »

RSS feed for comments on this post. TrackBack URL


Leave a Reply

Powered by WordPress. Theme: TheBuckmaker. PHP Scriptverzeichnis