/* 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; }
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; }
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; }
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]); } }
void articulation(int root) { resn=acn=0; memset(vis,0,n); memset(isartic,0,n); dfsvisit(0,-1); }