void DFSShowGraphVertex(ALGraphDFS*graph,int startV){ Stack stack; int visitV=startV; int nextV; StackInit(&stack); VisitVertex(graph,visitV); SAPush(&stack,visitV); while(LDFirst(&(graph->list[visitV]),&nextV)==TRUE){ int visitFlag=FALSE; if(VisitVertex(graph,nextV)==TRUE){ SAPush(&stack,visitV); visitV=nextV; visitFlag=TRUE; } else{ while(LDNext(&(graph->list[visitV]),&nextV)==TRUE){ if(VisitVertex(graph,nextV)==TRUE){ SAPush(&stack,visitV); visitV=nextV; visitFlag=TRUE; break; } } } if(visitFlag==FALSE){ if(SABIsEmpty(&stack)==TRUE) break; else visitV=SABPop(&stack); } } memset(graph->visit,0,sizeof(int)*graph->numV); }
void BFSShowGraphVertex(ALGraphBFS *graph,int startV){ Queue queue; int visitV=startV; int nextV; CQueueInit(&queue); VisitVertex(graph,visitV); while(LDFirst(&(graph->list[visitV]),&nextV)==TRUE){ if(VisitVertex(graph,nextV)==TRUE) CEnqueue(&queue,nextV); while(LDNext(&(graph->list[visitV]),&nextV)==TRUE){ if(VisitVertex(graph,nextV)==TRUE) CEnqueue(&queue,nextV); } if(CQIsEmpty(&queue)==TRUE) break; else visitV=CDequeue(&queue); } memset(graph->visit,0,sizeof(int)*graph->numV); }
void VisitVertex(struct Graph *G, int *par, int *comp, int v) { int i, component = 1; for (comp[v] = component, i = 0; i < G[v].size; i++) { if (comp[G[v].arr[i]] == -1 && par[G[v].arr[i]] != v) { VisitVertex(G, par, comp, G[v].arr[i]); } } }
int main() { struct Queue q;// = malloc(14000000000 * sizeof(int)); int v; int i; int n, m; scanf("%d", &n); scanf("%d", &m); char *last = calloc(n, sizeof(char)); int *par = calloc(n, sizeof(int)); int *component = calloc(n, sizeof(int)); struct Graph *G = malloc(n * sizeof(struct Graph)); for (i = 0; i < n;) { G[i].size = last[i] = 0; component[i++] = -1; } for (i = m; i > 0; i--) { int a, b; scanf("%d %d", &a, &b); G[a].arr[G[a].size++] = b; G[b].arr[G[b].size++] = a; } int comp = 1; for (q.head = q.tail = i = 0; i < n; q.head = q.tail = 0, i++) { if (!last[i]) { comp--; DFSRec(G, &q, par, i, last); } for (v = -1; QueueEmpty(&q);) { v = q.mas[q.head++]; if (component[v] == -1) { VisitVertex(G, par, component, v); comp++; } } } printf("%d\n", comp - 1); //free(q); free(G); free(last); free(par); free(component); return 0; }