AOJ_0545
有名な「僕は友達がいない」の問題
直接の友達の数を数える->友達の友達を数える の順番でプログラムをつくる。
直接の友達にしるしをつけておいて、友達の友達を判断する。
このとき、友達の友達にも、しるしを付けないと重複して数えてしまうので注意する。
それにしても、この問題は悲しすぎる。
#include <cstdio> #include <algorithm> using namespace std; typedef pair<int, int> P; const int MAX_M = 10000; const int MAX_N = 500; int friends[MAX_N + 1]; P kankei[MAX_M]; int n, m; void init(){ for(int i = 0; i <= n; i++) friends[i] = 0; } int main(){ while(scanf("%d %d", &n, &m)){ if(n == 0) return 0; init(); int sum = 0; //入力 for(int i = 0; i < m; i++){ int p, q; scanf("%d %d", &p, &q); if(p == 1){ //とりあえず直接の友達を数える sum++; friends[q] = 1; } kankei[i] = P(p, q); } //友達の友達を数える for(int i = 0; i < m; i++){ int p = kankei[i].first, q = kankei[i].second; if(p == 1) continue; if(friends[p] == 1 && friends[q] == 0){ friends[q] = 2; sum++; }else if(friends[q] == 1 && friends[p] == 0){ friends[p] = 2; sum++; } } printf("%d\n", sum); } return 0; }