给定一个图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;
}
}
}
}
}