#include long Time; long N = 15; class CEdge; class CVertex { public: CVertex *Prev; CVertex *Next; void * Visit; CEdge * EdgeHead; CEdge * EdgeTail; long ST; long FT; long ID; }; class CEdge { public: CEdge * Next; CVertex * Vertex; }; extern CVertex * AdjList[15]; void FindCC(); void main(int argc,char *argv[]) { FindCC(); fprintf(stdout,"%d\n",Time); for (long i=0 ; iID,AdjList[i]->ST,AdjList[i]->FT); } } CVertex * Tis; CEdge * EQ; extern int VisitID,VATrailer,ETDummyA,FinishID; extern CVertex Vertex0; extern CVertex Vertex1; extern CVertex Vertex2; extern CVertex Vertex3; extern CVertex Vertex4; extern CVertex Vertex5; extern CVertex Vertex6; extern CVertex Vertex7; extern CVertex Vertex8; extern CVertex Vertex9; extern CVertex Vertex10; extern CVertex Vertex11; extern CVertex Vertex12; extern CVertex Vertex13; extern CVertex Vertex14; extern CVertex Vertex15; extern CVertex Vertex1D; extern CVertex Vertex2D; extern CVertex Vertex3D; extern CVertex Vertex4D; extern CVertex Vertex5D; extern CVertex Vertex6D; extern CVertex Vertex7D; extern CVertex Vertex8D; extern CVertex Vertex9D; extern CVertex Vertex10D; extern CVertex Vertex11D; extern CVertex Vertex12D; extern CVertex Vertex13D; extern CVertex Vertex14D; extern CVertex Vertex15D; extern CVertex ETDummy; extern CVertex Trailer; CVertex * AdjList[15] = {&Vertex1,&Vertex2,&Vertex3,&Vertex4, &Vertex5,&Vertex6,&Vertex7,&Vertex8, &Vertex9,&Vertex10,&Vertex11,&Vertex12, &Vertex13,&Vertex14,&Vertex15}; CEdge V1F = {NULL,&Vertex1D}; CEdge V1E2 = {&V1F,&Vertex3}; CEdge V1E1 = {&V1E2,&Vertex2}; CEdge V2F = {NULL,&Vertex2D}; CEdge V2E4 = {&V2F,&Vertex1}; CEdge V2E3 = {&V2E4,&Vertex5}; CEdge V2E2 = {&V2E3,&Vertex4}; CEdge V2E1 = {&V2E2,&Vertex3}; CEdge V3F = {NULL,&Vertex3D}; CEdge V3E4 = {&V3F,&Vertex1}; CEdge V3E3 = {&V3E4,&Vertex5}; CEdge V3E2 = {&V3E3,&Vertex4}; CEdge V3E1 = {&V3E2,&Vertex2}; CEdge V4F = {NULL,&Vertex4D}; CEdge V4E3 = {&V4F,&Vertex5}; CEdge V4E2 = {&V4E3,&Vertex3}; CEdge V4E1 = {&V4E2,&Vertex2}; CEdge V5F = {NULL,&Vertex5D}; CEdge V5E3 = {&V5F,&Vertex4}; CEdge V5E2 = {&V5E3,&Vertex3}; CEdge V5E1 = {&V5E2,&Vertex2}; CEdge V6F = {NULL,&Vertex6D}; CEdge V6E2 = {&V6F,&Vertex8}; CEdge V6E1 = {&V6E2,&Vertex7}; CEdge V7F = {NULL,&Vertex7D}; CEdge V7E3 = {&V7F,&Vertex9}; CEdge V7E2 = {&V7E3,&Vertex8}; CEdge V7E1 = {&V7E2,&Vertex6}; CEdge V8F = {NULL,&Vertex8D}; CEdge V8E3 = {&V8F,&Vertex10}; CEdge V8E2 = {&V8E3,&Vertex7}; CEdge V8E1 = {&V8E2,&Vertex6}; CEdge V9F = {NULL,&Vertex9D}; CEdge V9E1 = {&V9F,&Vertex9}; CEdge V10F = {NULL,&Vertex10D}; CEdge V10E1 = {&V10F,&Vertex8}; CEdge V11F = {NULL,&Vertex11D}; CEdge V11E2 = {&V11F,&Vertex13}; CEdge V11E1 = {&V11E2,&Vertex12}; CEdge V12F = {NULL,&Vertex12D}; CEdge V12E2 = {&V12F,&Vertex13}; CEdge V12E1 = {&V12E2,&Vertex11}; CEdge V13F = {NULL,&Vertex13D}; CEdge V13E3 = {&V13F,&Vertex14}; CEdge V13E2 = {&V13E3,&Vertex12}; CEdge V13E1 = {&V13E2,&Vertex11}; CEdge V14F = {NULL,&Vertex14D}; CEdge V14E2 = {&V14F,&Vertex15}; CEdge V14E1 = {&V14E2,&Vertex13}; CEdge V15F = {NULL,&Vertex15D}; CEdge V15E1 = {&V15F,&Vertex14}; CEdge EdgeTrailer = {NULL,&ETDummy}; CVertex Vertex0 = {NULL,&Vertex1,NULL,NULL,NULL,0,0,0}; CVertex Vertex1 = {&Vertex0,&Vertex2,&VisitID,&V1E1,&V1F,0,0,1}; CVertex Vertex2 = {&Vertex1,&Vertex3,&VisitID,&V2E1,&V2F,0,0,2}; CVertex Vertex3 = {&Vertex2,&Vertex4,&VisitID,&V3E1,&V3F,0,0,3}; CVertex Vertex4 = {&Vertex3,&Vertex5,&VisitID,&V4E1,&V4F,0,0,4}; CVertex Vertex5 = {&Vertex4,&Vertex6,&VisitID,&V5E1,&V5F,0,0,5}; CVertex Vertex6 = {&Vertex5,&Vertex7,&VisitID,&V6E1,&V6F,0,0,6}; CVertex Vertex7 = {&Vertex6,&Vertex8,&VisitID,&V7E1,&V7F,0,0,7}; CVertex Vertex8 = {&Vertex7,&Vertex9,&VisitID,&V8E1,&V8F,0,0,8}; CVertex Vertex9 = {&Vertex8,&Vertex10,&VisitID,&V9E1,&V9F,0,0,9}; CVertex Vertex10 = {&Vertex9,&Vertex11,&VisitID,&V10E1,&V10F,0,0,10}; CVertex Vertex11 = {&Vertex10,&Vertex12,&VisitID,&V11E1,&V11F,0,0,11}; CVertex Vertex12 = {&Vertex11,&Vertex13,&VisitID,&V12E1,&V12F,0,0,12}; CVertex Vertex13 = {&Vertex12,&Vertex14,&VisitID,&V13E1,&V13F,0,0,13}; CVertex Vertex14 = {&Vertex13,&Vertex15,&VisitID,&V14E1,&V14F,0,0,14}; CVertex Vertex15 = {&Vertex14,&Trailer,&VisitID,&V15E1,&V15F,0,0,15}; CVertex Trailer = {&Vertex15,NULL,&VATrailer,NULL,NULL,0,0,0}; CVertex ETDummy = {NULL,NULL,&ETDummyA,NULL,NULL,0,0,0}; CVertex Vertex1D = {&Vertex1,NULL,&FinishID,NULL,NULL,0,0,1}; CVertex Vertex2D = {&Vertex2,NULL,&FinishID,NULL,NULL,0,0,2}; CVertex Vertex3D = {&Vertex3,NULL,&FinishID,NULL,NULL,0,0,3}; CVertex Vertex4D = {&Vertex4,NULL,&FinishID,NULL,NULL,0,0,4}; CVertex Vertex5D = {&Vertex5,NULL,&FinishID,NULL,NULL,0,0,5}; CVertex Vertex6D = {&Vertex6,NULL,&FinishID,NULL,NULL,0,0,6}; CVertex Vertex7D = {&Vertex7,NULL,&FinishID,NULL,NULL,0,0,7}; CVertex Vertex8D = {&Vertex8,NULL,&FinishID,NULL,NULL,0,0,8}; CVertex Vertex9D = {&Vertex9,NULL,&FinishID,NULL,NULL,0,0,9}; CVertex Vertex10D = {&Vertex10,NULL,&FinishID,NULL,NULL,0,0,10}; CVertex Vertex11D = {&Vertex11,NULL,&FinishID,NULL,NULL,0,0,11}; CVertex Vertex12D = {&Vertex12,NULL,&FinishID,NULL,NULL,0,0,12}; CVertex Vertex13D = {&Vertex13,NULL,&FinishID,NULL,NULL,0,0,13}; CVertex Vertex14D = {&Vertex14,NULL,&FinishID,NULL,NULL,0,0,14}; CVertex Vertex15D = {&Vertex15,NULL,&FinishID,NULL,NULL,0,0,15}; void FindCC() { Time = 0; NextVertex: asm("ETDummyA:\n\t.global\tETDummyA\n"); EQ = &EdgeTrailer; Tis = Vertex0.Next; goto * Tis->Visit; Visit1: asm("VisitID:\n\t.global\tVisitID\n"); // change the visit routine Tis->Visit = &&Visit2; // unhook me Tis->Prev->Next = Tis->Next; Tis->Next->Prev = Tis->Prev; // Compute StartTime Time++; Tis->ST = Time; // Queue all edges for processing Tis->EdgeTail->Next = EQ; EQ = Tis->EdgeHead; // Go to next edge Tis = EQ->Vertex; EQ = EQ->Next; goto * Tis->Visit; Visit2: // Go to next edge Tis = EQ->Vertex; EQ = EQ->Next; goto * Tis->Visit; Finish: asm("FinishID:\n\t.global\tFinishID\n"); // Compute Finish Time Time++; Tis->Prev->FT = Time; // Go to next edge Tis = EQ->Vertex; EQ = EQ->Next; goto * Tis->Visit; VTrailer: asm("VATrailer:\n\t.global\tVATrailer\n"); return; }