#include long ConnectedComponentNumber; void FindCC(); void main(int argc,char *argv[]) { FindCC(); fprintf(stdout,"%d\n",ConnectedComponentNumber); } class CEdge; class CVertex { public: CVertex *Prev; CVertex *Next; void * Visit; CEdge * EdgeHead; CEdge * EdgeTail; long CCN; long ID; }; class CEdge { public: CEdge * Next; CVertex * Vertex; }; CVertex * Tis; CEdge * EQ; extern int VisitID,VATrailer,ETDummyA; 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 ETDummy; extern CVertex Trailer; CEdge V1E2 = {NULL,&Vertex3}; CEdge V1E1 = {&V1E2,&Vertex2}; CEdge V2E4 = {NULL,&Vertex1}; CEdge V2E3 = {&V2E4,&Vertex5}; CEdge V2E2 = {&V2E3,&Vertex4}; CEdge V2E1 = {&V2E2,&Vertex3}; CEdge V3E4 = {NULL,&Vertex1}; CEdge V3E3 = {&V3E4,&Vertex5}; CEdge V3E2 = {&V3E3,&Vertex4}; CEdge V3E1 = {&V3E2,&Vertex2}; CEdge V4E3 = {NULL,&Vertex5}; CEdge V4E2 = {&V4E3,&Vertex3}; CEdge V4E1 = {&V4E2,&Vertex2}; CEdge V5E3 = {NULL,&Vertex4}; CEdge V5E2 = {&V5E3,&Vertex3}; CEdge V5E1 = {&V5E2,&Vertex2}; CEdge V6E2 = {NULL,&Vertex8}; CEdge V6E1 = {&V6E2,&Vertex7}; CEdge V7E3 = {NULL,&Vertex9}; CEdge V7E2 = {&V7E3,&Vertex8}; CEdge V7E1 = {&V7E2,&Vertex6}; CEdge V8E3 = {NULL,&Vertex10}; CEdge V8E2 = {&V8E3,&Vertex7}; CEdge V8E1 = {&V8E2,&Vertex6}; CEdge V9E1 = {NULL,&Vertex9}; CEdge V10E1 = {NULL,&Vertex8}; CEdge V11E2 = {NULL,&Vertex13}; CEdge V11E1 = {&V11E2,&Vertex12}; CEdge V12E2 = {NULL,&Vertex13}; CEdge V12E1 = {&V12E2,&Vertex11}; CEdge V13E3 = {NULL,&Vertex14}; CEdge V13E2 = {&V13E3,&Vertex12}; CEdge V13E1 = {&V13E2,&Vertex11}; CEdge V14E2 = {NULL,&Vertex15}; CEdge V14E1 = {&V14E2,&Vertex13}; CEdge V15E1 = {NULL,&Vertex14}; CEdge EdgeTrailer = {NULL,&ETDummy}; CVertex Vertex0 = {NULL,&Vertex1,NULL,NULL,NULL,0,0}; CVertex Vertex1 = {&Vertex0,&Vertex2,&VisitID,&V1E1,&V1E2,0,1}; CVertex Vertex2 = {&Vertex1,&Vertex3,&VisitID,&V2E1,&V2E4,0,2}; CVertex Vertex3 = {&Vertex2,&Vertex4,&VisitID,&V3E1,&V3E4,0,3}; CVertex Vertex4 = {&Vertex3,&Vertex5,&VisitID,&V4E1,&V4E3,0,4}; CVertex Vertex5 = {&Vertex4,&Vertex6,&VisitID,&V5E1,&V5E3,0,5}; CVertex Vertex6 = {&Vertex5,&Vertex7,&VisitID,&V6E1,&V6E2,0,6}; CVertex Vertex7 = {&Vertex6,&Vertex8,&VisitID,&V7E1,&V7E3,0,7}; CVertex Vertex8 = {&Vertex7,&Vertex9,&VisitID,&V8E1,&V8E3,0,8}; CVertex Vertex9 = {&Vertex8,&Vertex10,&VisitID,&V9E1,&V9E1,0,9}; CVertex Vertex10 = {&Vertex9,&Vertex11,&VisitID,&V10E1,&V10E1,0,10}; CVertex Vertex11 = {&Vertex10,&Vertex12,&VisitID,&V11E1,&V11E2,0,11}; CVertex Vertex12 = {&Vertex11,&Vertex13,&VisitID,&V12E1,&V12E2,0,12}; CVertex Vertex13 = {&Vertex12,&Vertex14,&VisitID,&V13E1,&V13E3,0,13}; CVertex Vertex14 = {&Vertex13,&Vertex15,&VisitID,&V14E1,&V14E2,0,14}; CVertex Vertex15 = {&Vertex14,&Trailer,&VisitID,&V15E1,&V15E1,0,15}; CVertex Trailer = {&Vertex15,NULL,&VATrailer,NULL,NULL,0,0}; CVertex ETDummy = {NULL,NULL,&ETDummyA,NULL,NULL,0,0}; void FindCC() { ConnectedComponentNumber = 0; NextVertex: asm("ETDummyA:\n\t.global\tETDummyA\n"); ConnectedComponentNumber++; 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; // Set CC Number Tis->CCN = ConnectedComponentNumber; // 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; VTrailer: asm("VATrailer:\n\t.global\tVATrailer\n"); return; }