takapt0226's diary

競技プログラミングのことを書きます

POJ 3660 Cow Contest

解法

入力から有向グラフを作る。AがBに勝ったという情報からA -> Bに辺を張る
このグラフ上でiからjに到達可能ならば、iはjに勝てる

n cows中でiがkthの時、iは(n - k)cowsにwin and iは(k - 1)cowsにlose
順位が決定できる場合、win + lose == (n - k) + (k - 1) == n - 1となる

ソースコード

int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    bool e[128][128];
    CL(e, 0);
    while (m--)
    {
	int a, b;
	scanf("%d%d", &a, &b);
	--a, --b;
	e[a][b] = true;
    }
    rep(k, n) rep(i, n) rep(j, n)
	e[i][j] |= e[i][k] && e[k][j];

    int win[128] = {}, lose[128] = {};
    rep(i, n)
	rep(j, n)
	    if (e[i][j])
		++win[i], ++lose[j];

    int res = 0;
    rep(i, n)
	if (win[i] + lose[i] == n - 1)
	    ++res;
    printf("%d\n", res);
}