티스토리 뷰
#include <stdio.h>
#define INF 10000000
int main(void) { //단방향 그래프
int n, m;
scanf("%d %d", &n, &m);
int d[501][501]; //최단거리를 담는 배열
for(int i = 1; i<=n; i++) { //최단거리를 INF로 초기화
for(int j=1; j<=n; j++) d[i][j] = INF;
d[i][i] = 0; //자기자신은 0
}
while(m--) { //정보 입력
int a, b;
scanf("%d %d", &a, &b);
d[a][b] = 1;
}
for(int k=1; k<=n; k++) //Floyd Warshall
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++) {
if(d[i][k] + d[k][j] < d[i][j])
d[i][j] = d[i][k] + d[k][j];
}
int sum[501] = {0}; //각 사람에 대한 연결된 그래프의 총합
int ans = 0;
for(int i = 1; i<=n; i++) { //연결된 그래프 세기
for(int j=1; j<=n; j++) {
if(d[i][j] < INF) {
sum[i]++;
sum[j]++;
}
}
for(int i = 1; i<=n; i++) { //연결된 그래프가 n+1이면 그 사람은 다른 모든 사람들과 연결 되었다는 의미
if(sum[i] == n+1) ans++; //n+1인 이유는 위의 연결된 그래프 세기에서 자기자신의 경우 +2가 되기 때문
}
printf("%d", ans);
}
풀이 : Floyd Warshall
0) 입력을 받는다
1) 최단 거리 배열을 INF로 초기화한다 (자기 자신은 거리가 0인 그래프가 있다고 가정)
2) 정보들을 입력 받는다, 그때의 거리는 1로 한다.
3) Floyd Warshall
4) 거리가 INF가 아니라면, 이는 서로가 그래프로 연결되어 있다는 의미이므로, 몇 개가 연결되어있는지를 구한다.
5) 만약 n+1개 가 연결되어 있다면 (원래는 n-1이나, 자기자신을 연결하는 그래프를 계산하면 +2가 된다)
6) 그래프가 n+1 연결 된 것의 개수의 합을 출력한다.
https://www.acmicpc.net/problem/2458
2458번: 키 순서
1번부터 N번까지 번호가 붙여져 있는 학생들에 대하여 두 학생끼리 키를 비교한 결과의 일부가 주어져 있다. 단, N명의 학생들의 키는 모두 다르다고 가정한다. 예를 들어, 6명의 학생들에 대하여
www.acmicpc.net
'c언어 > BAEKJOON' 카테고리의 다른 글
c언어 23286번 허들 넘기 (백준) (0) | 2023.01.03 |
---|---|
c언어 2224번 명제 증명 (백준) (0) | 2023.01.02 |
c언어 17182번 우주 탐사선 (백준) (0) | 2023.01.02 |
c언어 16958번 텔레포트 (백준) (0) | 2023.01.01 |
c언어 15723번 n단 논법 (백준) (0) | 2022.12.31 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 누적 합
- 덱
- 스택
- java
- union
- BFS
- find
- 그래프
- 1835번
- 백준
- 누적합
- DP
- 최소 스패닝 트리
- 세그먼트 트리
- C++
- PASCAL
- Lazy Propagation
- 정렬
- 1835
- Krustal
- 최대공약수
- XOR
- DFS
- 플로이드
- 그리디
- Segment Tree
- 기하학
- C언어
- 브루트포스
- 오프라인 쿼리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함