ykmakuのブログ

競技プログラミングをがんばるブログ

AtCoder Grand Contest 002 B - Box and Ball

  • 問題

B - Box and Ball

  • 解法

シュミレーションで間に合う。
各箱に赤のボールが入っているかどうかということと、各箱のボールの数を記憶すればよい。
x[i]に赤いボールが入っている時に操作を行えば、y[i]に赤いボールが入っている可能性があることになる。操作をおこなって箱x[i]に入っているボールの数が0個になるならx[i]に赤いボールが入っている可能性はなくなる。

#include <iostream>
#include <string>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <queue>
#include <set>
#include <numeric>
#include <cmath>

using namespace std;

typedef long long int ll;

#define all(x) x.begin(),x.end()

const ll mod = 1e9+7;
const ll INF = 1e9;
const ll MAXN = 1e9;

int main()
{
	int n,m;
	cin >> n >> m;
	vector<int> x(m),y(m);
	for(int i = 0; i < m; i++){
		cin >> x[i] >> y[i];
	}

	vector<int> num(n+1),red(n+1);
	red.assign(red.size(),0);
	num.assign(num.size(),1);
	red[1] = 1;

	for(int i = 0; i < m; i++){
		num[x[i]]--;
		num[y[i]]++;
		if(red[x[i]] == 1){
			red[y[i]] = 1;
			if(num[x[i]] == 0) red[x[i]] = 0;
		}
	}

	int ans = 0;
	for(int i = 1; i <= n; i++){
		if(red[i]==1)ans++;
	}

	cout << ans << endl;

	return 0;
}