TADM2E 5.17
From Algorithm Wiki
Revision as of 05:45, 31 January 2016 by Rahul Biswas (talk | contribs) (Created page with "use dfs to find cycle of lenght 3. we maintain an array parent[i]. while processing any backedge u-v we check whether gradparent of u is equal to v .if true we found a cycle...")
use dfs to find cycle of lenght 3.
we maintain an array parent[i].
while processing any backedge u-v we check whether gradparent of u is equal to v .if true we found a cycle of lenght 3.
1
| / \ | / \ | 2 3 | / \ | / \ -4 5
Here u=4 to v=1 has backedge and grandparent of u=4 is 1,so condition satifies parent[parent[u]] == v hence given graph has cycle of lenght 3.we stop here to futher explore dfs().
/* java program
* To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */
package pkg5.pkg9;
import java.util.ArrayList; import java.util.Scanner; import static pkg5.pkg9.TwoColor.nodes;
/**
* * @author Rahul */
public class Test5_17 {
/** * @param args the command line arguments */ static ArrayList<ArrayList<Integer>> graph ; static int nodes; static int edges; static boolean[] disc; static boolean[] processed; static Integer[] parent; static boolean found3_LenCycle = false; public static void main(String[] args) { // TODO code application logic here Scanner in = new Scanner(System.in); nodes = in.nextInt(); edges = in.nextInt(); disc = new boolean[nodes]; processed = new boolean[nodes]; parent = new Integer[nodes]; graph = new ArrayList<ArrayList<Integer>>(nodes); for(int i=0;i < nodes;i++) graph.add(i,new ArrayList<Integer>()); for(int i=0;i < edges;i++){ int u = in.nextInt(); int v = in.nextInt(); graph.get(u).add(v); graph.get(v).add(u); } for(int i=0;i < nodes;i++){ if( !disc[i]){ parent[i] = null; dfs(i); } } if(found3_LenCycle) System.out.println("found 3-length cycle"); else System.out.println("not found 3-length cycle"); } public static void dfs(Integer u){ //processVertexEarly(node); ArrayList<Integer> adjList = graph.get(u); disc[u] = true; for(Integer v : adjList){ if( !disc[v]){//tree edge parent[v]= u; // processEdge(u,v); dfs(v); }else if(!processed[v]){ //back edge processEdge(u,v); } if(found3_LenCycle) break; } processed[u] = true; } public static void processEdge(Integer u,Integer v){ if(parent[parent[u]] != null && parent[parent[u]]==v ) found3_LenCycle = true; }
}