알고리즘 풀이/DFS
백준 1240 노드사이의 거리 ::들짐승
FieldAnimal
2018. 7. 22. 22:26
<링크>
https://www.acmicpc.net/problem/1240
<풀이>
모든 노드를 시작점으로 잡아 dfs를 한번씩 해준다.
dfs를 재귀 호출할 때마다 노드 간의 거리를 계속 더해서 인자로 넘기면, 시작점부터 현재노드까지의 거리가 된다.
dist[i][j] = i부터 j까지의 거리
<소스코드>
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #include<stdio.h> #include<vector> using namespace std; vector<pair<int,int>> adj[1001]; int isVisited[1001]; int dist[1001][1001]; void dfs(int, int, int); int main() { int N, M; scanf("%d%d", &N, &M); for(int n=0;n<N-1;++n) { int a, b, c; scanf("%d%d%d", &a, &b, &c); adj[a].push_back({ b,c }); adj[b].push_back({ a,c }); } for (int i = 1; i <= N; ++i) { isVisited[i] = 1; dfs(i, i,0); isVisited[i] = 0; } while (M--) { int a, b; scanf("%d%d", &a, &b); printf("%d\n", dist[a][b]); } } void dfs(int start,int i,int len) { dist[start][i] = len; int size = adj[i].size(); for (int j = 0; j < size; ++j) { int toi = adj[i][j].first; int cost = adj[i][j].second; if (!isVisited[toi]) { isVisited[toi] = 1; dfs(start, toi, len + cost); isVisited[toi] = 0; } } } | cs |