Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //retstituisce il grafo G trasposto
- Graph grafoTrasposto(Graph G){
- Graph T= initGraph(G->nodes_count);
- for(int i=0; i<G->nodes_count; i++){
- List L= G->adj[i];
- while(L != NULL){
- addEdge(T, L->target, i, L->peso);
- L= L->next;
- }
- }
- return T;
- }
- //maschera per le CFC
- void CFC_Interface(Graph G){
- if(G != NULL){
- int color[G->nodes_count];
- CFC(G, color);
- }
- }
- //il vero e proprio algoritmo
- void CFC(Graph G, int color[]){
- List L= NULL;
- L= DFS2(G, color);
- Graph G1= grafoTrasposto(G);
- DFS1(G1, L, color);
- }
- //restituisce i vertici visitati dalla DFS
- List DFS2(Graph G, int color[]){
- List L= NULL;
- INIT(G->nodes_count, color);
- for(int i=0; i<G->nodes_count; i++){
- if(color[i]==BIANCO)
- DFS2_visit(G, i, color, L);
- }
- return L;
- }
- //visita in profondità il grafo G a partire dal vertice v, e a fine visita aggiunge il vertice alla lista
- void DFS2_visit(Graph G, int v, int color[], List L){
- color[v]= GRIGIO;
- List L1= G->adj[v];
- while(L1 != NULL){
- if(L1->target == BIANCO)
- DFS2_visit(G, L1->target, color, L);
- L1= L1->next;
- }
- color[v]= NERO;
- L= addNodeList(L, v, 0);
- }
- //DFS modificata la cui sorgente è la lista L
- void DFS1(Graph G, List L, int color[]){
- INIT(G->nodes_count, color);
- List tmp= L;
- while(tmp != NULL){
- if(color[tmp->target] == BIANCO)
- DFS_visit(G, tmp->target, color);
- tmp= tmp->next;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement