`

给定一个图G,要找出有多少个三角形包括了指定的点。

阅读更多
 给定一个图G(V,E),V是点的集合有n个点,E是边的集合有m条边,现在问题是对图中任意一个点v,要找出有多少个三角形包括了这个点。 
邻接矩阵辅助,进行图的深度优先遍历。取需
import java.util.Scanner;
public class Main {
	
	public static int q=0;	//	目标节点
	public static int n;
	public static int m;
	public static int[][] maze;
	public static int count=0; //结果存储

	public static int[] book; //标记数组
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		//输入n:点的个数
		//m:边的条数
		n=sc.nextInt();
		m=sc.nextInt();
		maze=new int [n][n];
		book=new int[n];
		
		//初始化邻接矩阵
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < 0; j++) {
				maze[i][j]=0;
			}
		}
		//初始化标记数组
		for (int i = 0; i < n; i++) {
			book[i]=0;
		}
		//输入边
		for (int i = 0; i <m; i++) {
			int x=sc.nextInt();
			int y=sc.nextInt();
			maze[x][y]=1;
			maze[y][x]=1;
		}

		//0开始,0结束
		dfs(0, 0);
		//同一个三角形走过了两次,所以要除以2
		System.out.println(count/2);
	}
	
	public static void dfs(int index,int step){
			
		System.out.println("当前到达index= "+index);
		//判断是否到达目标节点且步数为3
		if(index==q&&step==3){
			//计数加1
			count++;
			return;
		}
		//步数为3还未到达目标节点则返回
		if(step>=3){
			return;
		}
		//枚举下一个可以到达的点
		for (int i = 0; i < n; i++) {
			//下一个点不能是自己且有通路到达下一个点
			if(i!=index &&maze[index][i]==1){
				//下一个点是目标节点直接访问
				if(i==q){
					dfs(i,step+1);
					continue;
				}
				//下一个点未被访问过则递归访问,步数+1
				if(book[i]!=1){
					book[i]=1;
					dfs(i,step+1);
					book[i]=0;
				}
			}
		}
		
	}

}
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics