8월 18일(금) - 그래프와 순회 (11403번)
11403번: 경로 찾기
가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 길이가 양수인 경로가 있는지 없는지 구하는 프로그램을 작성하시오.
www.acmicpc.net
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
최초 생각 정리
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
문제점
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
풀이 - 1
(플로이드 - 워셜 알고리즘 풀이)
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define INF 987654321
#include <stdio.h>
int arr[101][101];
int main(void)
{
int N;
scanf("%d", &N);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
scanf("%d", &arr[i][j]);
if (arr[i][j] == 0)
{
arr[i][j] = INF;
}
}
}
for (int k = 0; k < N; k++)
{
for (int i = 0; i < N; i++)
{
for(int j=0;j<N;j++)
{
arr[i][j] = MIN(arr[i][j], arr[i][k] + arr[k][j]);
}
}
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (arr[i][j] == INF)
{
printf("0 ");
}
else
{
printf("1 ");
}
}
printf("\n");
}
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
풀이 - 2
(DFS 방식의 풀이)
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <stdio.h>
#include <string.h>
int N;
int map[101][101];
int final_map[101][101];
int visited[101][101];
void dfs(int target, int v)
{
for (int i = 0; i < N; i++)
{
if (map[v][i] == 1 && visited[v][i] == 0)
{
final_map[target][i] = 1;
visited[v][i] = 1;
dfs(target, i);
}
}
}
int main(void)
{
scanf("%d", &N);
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
scanf("%d", &map[i][j]);
}
}
for (int i = 0; i < N; i++)
{
memset(visited, 0, sizeof(visited));
dfs(i, i);
}
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
printf("%d ", final_map[i][j]);
}
printf("\n");
}
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
'백준(C언어) > 23년 8월' 카테고리의 다른 글
[C] 백준 - 1049번: 기타줄 (1) | 2023.08.23 |
---|---|
[C] 백준 - 11054번: 가장 긴 바이토닉 부분 수열 (0) | 2023.08.21 |
[C] 백준 - 11725번: 트리의 부모 찾기 (0) | 2023.08.17 |
[C] 백준 - 1439번: 뒤집기 (0) | 2023.08.16 |
[C] 백준 - 2629번: 양팔저울 (0) | 2023.08.14 |
댓글