/**
* 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);
}