# include < iostream >
using namespace std ;
int main ( ) {
int n;
int graph[ 100 ] [ 100 ] ;
cin > > n;
for ( int i= 0 ; i< n; i+ + )
for ( int j= 0 ; j< n; j+ + )
cin > > graph[ i] [ j] ;
for ( int k= 0 ; k< n; k+ + )
for ( int i= 0 ; i< n; i+ + )
for ( int j= 0 ; j< n; j+ + )
if ( graph[ k] [ j] & & graph[ i] [ k] ) graph[ i] [ j] = 1 ;
for ( int i= 0 ; i< n; i+ + )
{
for ( int j= 0 ; j< n; j+ + )
cout < < graph[ i] [ j] < < ' ' ;
cout < < endl ;
}
return 0 ;
}
코드보기
이 문제는
모든 점 에서 갈 수 있는 경로를 찾는 문제이다.
이러한 문제는
플로이드-워셜 알고리즘을 사용한다. 말이야 거창하지만,
for 문을 i, j, k에 대하여 각각 반복함으로써, 모든 점에서 가능한 경우를 확인하는 것이다.
여기서 중요한 점은 i, j에 대한 모든 점을 확인할 때,
중간 점으로 사용하는 k의 for 문이 가장 바깥에 위치 해야 한다. (코드 참고)
이런 과정을 거치면 우리가 가진 graph 배열은 모든 점에서의 경로를 갖게된다.
Artikel Menarik Lainnya
동전2 | 백준 2294번
#include <cstdio>
int main(void) {
int n, k, num;
int N[100], K[10001]={0};
scanf(
1,2,3 더하기 | 백준 9095번
#include <cstdio>
int main(void)
{
int t;
scanf("%d", &t);
for(
위상정렬 | Topological sort
위상정렬이라는 것은, 문제를 풀때 참 많이 쓰이는 기본적인 알고리즘이다.
위상 정렬은 DAG 그래프를 기본으로 사용되는데, DAG(Directed Acyclic Graph
타일 채우기 | 백준 2133번
#include<cstdio>
int main(void)
{
int n;
int result[31]={0};
int sum=0;// sum =
숫자삼각형 | 백준 1932번
#include <stdio.h>
int main(void) {
// your code goes here
int triangle[501][501];
in
연속합 | 백준 1912번
이번 문제는 시간 초과 때문에 생각을 많이 했다.
어쩌면 더 쉽게 풀 수 있는 걸, 전에 풀어봤던 다른 생각에 갇혀 있던 것 아니었나 싶다.
맨 처음 생각한 알고리즘은 다음과
EmoticonEmoticon