Пример #1
0
/* for vertex i, id of component is in con[i] */
int scc() {
	static int dfsres[MAXV];
	int i,t,c=0;
	memset(vis,0,n);
	for(resn=i=0;i<n;i++) if(!vis[i]) dfsvisit(i,-1);
	/* transpose graph */
	memcpy(dfsres,res,n*sizeof(int));
	for(i=0;i<ne;i++) t=from[i],from[i]=to[i],to[i]=t;
	countingsort();
	memset(vis,0,n);
	for(resn=0,i=n-1;i>=0;i--) if(!vis[dfsres[i]]) dfsvisit(dfsres[i],c++);
	return c;
}
Пример #2
0
void dfsvisit(int v,int p) {
	int ch=0,i,w;
	vis[v]=1;
	ud[v]=ulow[v]=++resn;
	for(i=gs[v];i<gs[v+1];i++) {
		w=to[i];
		if(w==p) continue;
		if(vis[w]) {
			if(ulow[v]>ud[w]) ulow[v]=ud[w];
		} else {
			dfsvisit(w,v);
			if(ulow[v]>ulow[w]) ulow[v]=ulow[w];
			if(ulow[w]>=ud[v] && p>-1 && !isartic[v]) isartic[v]=1,ac[acn++]=v;
			ch++;
		}
	}
	if(p<0 && ch>1 && !isartic[v]) isartic[v]=1,ac[acn++]=v;
}
Пример #3
0
void dfsvisit(graph * g, int source, int * p, int * b , int * f , int *s, int *tm) {
	printf("%x\n", tm);

	 *tm = *tm + 1;
	b[source] = *tm;
	s[source] = 1;

	node * ele;
	int t;
	ele = g->adj[source];

	while(ele != NULL) {
		t = ele->v;

		if(s[t] == 0) {
			// discovery edge
			p[t] = source;
			labelEdge(g, source, t, 'd');
			dfsvisit(g, t, p, b, f, s, tm);
		}
		else if(b[t] < b[source] && s[t] == 1) {
			//backward edge
			labelEdge(g, source, t, 'b');
		}
		else if(b[t] > b[source] && s[t] == 2 && f[t] > b[t]) {
			// forward edge
			labelEdge(g, source, t, 'f');		
		}
		else {
			// cross edge 
			labelEdge(g, source, t, 'c');
		}
		ele = ele->next;
	}
	*tm = *tm + 1;
	f[source] = *tm;
	s[source] = 2;
}
Пример #4
0
void dfsinit(graph *g, int source) {
	int ver = g->v;

	int p[ver];
	int b[ver];
	int f[ver];
	int s[ver];

	int i=0, t, l;
	node * ele;

	for(i=0;i<ver;i++) {
		p[i] = -1;
		b[i] = -1;
		f[i] = -1;
		s[i] = 0;
	}

	int q = 0;
	int *tm;
	tm = &q;

	printf("%x", tm);

	p[source] = -1;
	
	for(i=0;i<ver;i++) {
		if(s[i] == 0)
			dfsvisit(g, i, p, b, f, s, tm);
	}

	for(i=0;i<ver;i++) {
		printf("%d\t%d\t%d\t%d\n", p[i], b[i], f[i], s[i]);
	}

}
Пример #5
0
void articulation(int root) {
	resn=acn=0;
	memset(vis,0,n);
	memset(isartic,0,n);
	dfsvisit(0,-1);
}