플로이드-워셜로 풀면 쉽게 풀리는 문제.
i > k이고, k > j로 대소 관계가 정해지면 i > j의 대소관계가 정해지는 점을 이용해 주면 된다.
#include <iostream>
#include <vector>
#define INF 987654321
using namespace std;
int N, M;
int dp[101][101];
void init(){
for(int i = 1; i <= N; i++){
for(int j = 1; j <= N; j++){
dp[i][j] = 0;
}
}
}
void input(){
cin >> N;
cin >> M;
for(int i = 0; i < M; i++){
int a, b;
cin >> a >> b;
dp[a][b] = 1;
}
}
void floyd(){
for(int k = 1; k <= N; k++){
for(int i = 1; i <= N; i++){
for(int j = 1; j <= N; j++){
if(dp[i][k] == 1 && dp[k][j] == 1) dp[i][j] = 1;
}
}
}
for(int i = 1; i<= N; i++){
int cnt = 0;
for(int j = 1; j <= N; j++){
if(i==j) continue;
if(dp[i][j] == 0 && dp[j][i] == 0) cnt++;
}
cout << cnt <<"\n";
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
init();
input();
floyd();
return 0;
}
