PS/inflearn java coding
인접행렬을 이용한 그래프 표현 방법
easy16
2022. 4. 12. 01:09
1. 무방향 그래프 (인접행렬 2차 행렬로 나타냄.)
ex) 하나의 좌표가 주어지면 아래와 같이 표기한다.
1 2 -> 2 1
1 3 -> 3 1
2 4 -> 4 2
3 4 -> 4 3
2 5 - > 5 2
graph[a][b] =1 , graph[b][a] =1;
index : edge, value of 1: vertex.
2. 방향 그래프 (인접행렬 2차 행렬로 나타냄.)
ex) 무방향 그래프와 비교
1 2
1 3
2 4
3 4
2 5
graph[a][b] =1
index : edge, value of 1: vertex.
3. 가중치 방향 그래프 (인접행렬 2차 행렬로 나타냄.)
ex) 방향 그래프와 비교
1 2
1 3
2 4
3 4
2 5
graph[a][b] = c;
index : edge, value of 1: vertex.
//1번 노드에서 5번 노드로 갈 수 있는 경우의 수.
class Main {
static int n,m;
static int [] ch;//중복 방지용 : 한번 지나간 정점은 다시 찾지 않는다.(무한루프 방지)
static int [][] graph;
static int answer;
public void DFS(int V) {
//5번 노드로 가는 경우의 수
if( V == 5) {
answer ++;
} else {
for ( int i = 1 ; i <= n ; i++) {
if( graph[V][i]==1 && ch[i] == 0) {
//i 정점을 거치는 경우
ch[i]=1;
DFS(i);
//i 정점을 거치지 않는 경우
ch[i]=0;
}
}
}
return;
}
public static void main(String args[]) throws Exception {
Main M = new Main();
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
//정점 번호를 -1 연산하지 않기 위해 +1 추가
graph = new int[n+1][n+1];
ch = new int[n+1];
for ( int i =0 ; i < m ; i ++) {
graph[in.nextInt()][in.nextInt()] = 1;
}
for ( int i = 1 ; i <= n ; i++) {
for (int j = 1 ; j <= n ; j++)
System.out.print(graph[i][j]);
System.out.println();
}
//첫번째 정점 초기화.
ch[1] = 1;
M.DFS(1);
System.out.println(answer);
}
}
ex) 5 정점수, 9 간선수
input
5 9
1 2
1 3
1 4
2 1
2 3
2 5
3 4
4 2
4 5
output
6