/** * This program is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see * . * * (c) Vincenzo Nicosia 2009-2017 -- * * This file is part of NetBunch, a package for complex network * analysis and modelling. For more information please visit: * * http://www.complex-networks.net/ * * If you use this software, please add a reference to * * V. Latora, V. Nicosia, G. Russo * "Complex Networks: Principles, Methods and Applications" * Cambridge University Press (2017) * ISBN: 9781107103184 * *********************************************************************** * * This program computes (the size of) all the components associated * to a node, namely the OUT-, IN-, SCC (strongly connected * component), and the WCC (weekly connected component). * * */ #include #include #include #include "utils.h" #define COMP_IN 0x01 #define COMP_OUT 0x02 #define COMP_WCC 0x04 #define COMP_SCC 0x08 #define COMP_ALL (COMP_IN | COMP_OUT | COMP_WCC | COMP_SCC) void usage(char *argv[]){ printf("********************************************************************\n" "** **\n" "** -*- node_components -*- **\n" "** **\n" "** Find all the components associated to a node of a directed **\n" "** graph, namely the IN-, OUT-, SCC, and WCC, and print on **\n" "** output their size and/or the list of nodes belonging to **\n" "** each component. The first parameter 'graph_in' is the name **\n" "** of the file containing the edge list of the graph. **\n" "** **\n" "** The second parameter 'node' is the label of the node whose **\n" "** components we are interested in. The (optional) third **\n" "** parameter can be one of 'IN', 'OUT', 'INOUT', **\n" "** 'SCC', 'WCC', respectively corresponding to the IN-, OUT-, **\n" "** IN- and OUT-, strongly connected and weakly connected **\n" "** component to which 'node' belongs. If the is **\n" "** 'ALL', the program computes all the components to which **\n" "** 'node' belongs. If no third parameter is provided, all **\n" "** the components are computed by default. **\n" "** **\n" "** If SHOW is given as fourth argument, the list nodes in each **\n" "** component is dumped on output as well. **\n" "** **\n" "********************************************************************\n" " This is Free Software - You can use and distribute it under \n" " the terms of the GNU General Public License, version 3 or later\n\n" " Please visit http://www.complex-networks.net for more information\n\n" " (c) Vincenzo Nicosia 2010-2017 (v.nicosia@qmul.ac.uk)\n" "********************************************************************\n\n" ); printf("Usage: %s [ [SHOW]]\n\n" , argv[0]); } int dfs(unsigned int i, unsigned int *J_slap, unsigned int *r_slap, unsigned int N, unsigned int nc, unsigned int *ic, unsigned int *f, char reset){ static unsigned int time = 0; unsigned int j, s; if(reset){ time = 0; } ic[i] = nc; s = 1; for(j=r_slap[i]; j=0; i--){ idx = f[i]; while( (*ic) [idx] != 0 && i > 0 ){ i -= 1; idx = f[i]; } if (i == 0) break; nc += 1; if (nc == 1){ s = dfs(idx, J_slap, r_slap, N, nc, *ic, *f_T, 1); } else{ s = dfs(idx, J_slap, r_slap, N, nc, *ic, *f_T, 1); } (*sizes)[nc] = s; } return nc; } void compute_comp_out(FILE *filein, unsigned int node, char show){ unsigned int N, K, size, i; unsigned int *J_slap, *r_slap, *ic, *f, *I, *J; I = J = NULL; K = read_ij(filein, &I, &J); rewind(filein); J_slap = NULL; r_slap = NULL; /* obtain the SLAP representation of the graph */ N = convert_ij2slap(I, J, K, &r_slap, &J_slap); ic = malloc(N * sizeof(unsigned int)); f = malloc(N * sizeof(unsigned int)); for(i=0; i= N2 ? N1 : N2; components(J_slap, r_slap, N, &ic, &f, &sizes); components_rev(J_slap_T, r_slap_T, N, &ic_T, f, &f_T, &sizes_T); node_comp = ic_T[node]; printf("SCC: %d", sizes_T[node_comp]); if (show){ for(j=0; j 4 && !my_strcasecmp("SHOW", argv[4])){ show = 1; } switch(mode){ case COMP_IN: compute_comp_in(filein, node, show); break; case COMP_OUT: compute_comp_out(filein, node, show); break; case COMP_IN | COMP_OUT: compute_comp_in(filein, node, show); compute_comp_out(filein, node, show); break; case COMP_WCC: compute_wcc(filein, node, show); break; case COMP_SCC: compute_scc(filein, node, show); break; default: compute_comp_in(filein, node, show); compute_comp_out(filein, node, show); compute_wcc(filein, node, show); compute_scc(filein, node, show); }; fclose(filein); }