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;
}