티스토리 뷰
이 문제는 DFS 기초 문제이다. 하지만 재귀로 풀려고했을때 처음에는 시간 초과가 나서 약간 삽질을 좀 했다..
문제는 우선 1->2->3으로 갈수 있을때 1->3으로도 갈수있으므로 W[1][3]도 갈수있다고 1로 체크해주는 문제이다.
즉 중간에 몇개를 거쳐서라도 갈수 있으면 그 경로는 갈수있다고 체크를 해준다.
워셜-플로이드 알고리즘으로도 풀수 있지만 나는 dfs를 연습하고 싶어서 굳이 dfs로 풀었다.
첫번째 예제로 설명을 하자면,
1->2 , 2->3 , 3->1로 갈수있는 경로가 있다.
먼저 첫번째 정점인 1번 정점에서 갈수있는 경로를 모두 조사한다.
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(!visited[i][i] && input[i][j])
go(i,i,j);
}
}
void go(int top,int x,int y)
{
input[top][y] = 1;
visited[top][y] = true;
for(int i=1; i<=n; i++)
{
if(!visited[top][i] && input[y][i])
go(top,y,i);
}
}
top이란것은 몇번째 정점에서 시작한것이냐다. 즉 1번정점에서 갈수있는 모든 정점을 조사하고싶을때 top은 1이며 1번정점에서 갈수있는 경로를 모두 조사하기 전까지는 top은 바뀌지 않는다.
1번정점을 모두 조사하면
2번정점,
3번정점에서 갈수있는 모든 경로를 다 조사하게 되면 재귀를 멈추게 된다.
그리고 각 정점에서 시작했을때 그 정점을 방문했다는것을 표시를 해놔야 같은 계산을 피할수있기 때문에 visited라는 2차원 배열을 사용하였다. 이것을 사용하지 않으면 시간초과가 나기때문에 무조건 써줘야한다. 트리를 그리면서 생각해보면 이 코드를 쉽게 이해할수 있을것이다.
전체코드
#include <iostream>
using namespace std;
int input[101][101];
bool visited[101][101];
int n;
void go(int top,int x,int y)
{
input[top][y] = 1;
visited[top][y] = true;
for(int i=1; i<=n; i++)
{
if(!visited[top][i] && input[y][i])
go(top,y,i);
}
}
int main()
{
scanf("%d",&n);
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
scanf("%d",&input[i][j]);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(!visited[i][i] && input[i][j])
go(i,i,j);
}
}
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
printf("%d ",input[i][j]);
printf("\n");
}
return 0;
}
'알고리즘' 카테고리의 다른 글
DFS + 메모이제이션(DP) (2) | 2017.08.17 |
---|---|
2583번 영역 구하기 BFS 큐 벡터 (0) | 2017.08.15 |
1049번 기타줄 (0) | 2017.08.10 |
자료구조와 알고리즘에 대해서 (0) | 2017.08.08 |
1021번 회전하는 큐 (0) | 2017.08.07 |
- Total
- Today
- Yesterday
- es6
- reflow
- hydrate
- mobx
- return type
- rendering scope
- state
- useRef
- webpack
- storybook
- Babel
- promise
- Polyfill
- server side rendering
- react hooks
- Next.js
- type alias
- props
- react
- reducer
- typescript
- Action
- async
- atomic design
- useEffect
- computed
- javascript
- await
- design system
- reactdom
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |