結果

問題 No.3340 Simple Graph Game
コンテスト
ユーザー tnakao0123
提出日時 2025-11-14 16:05:27
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 101 ms / 2,000 ms
コード長 1,136 bytes
コンパイル時間 555 ms
コンパイル使用メモリ 63,588 KB
実行使用メモリ 24,404 KB
最終ジャッジ日時 2025-11-18 10:40:53
合計ジャッジ時間 4,047 ms
ジャッジサーバーID
(参考情報)
judge5 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 59
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:35:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   35 |   scanf("%d%d", &n, &m);
      |   ~~~~~^~~~~~~~~~~~~~~~
main.cpp:38:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   38 |     scanf("%d%d", &u, &v);
      |     ~~~~~^~~~~~~~~~~~~~~~

ソースコード

diff #

/* -*- coding: utf-8 -*-
 *
 * 3340.cc:  No.3340 Simple Graph Game - yukicoder
 */

#include<cstdio>
#include<vector>
#include<queue>
#include<algorithm>

using namespace std;

/* constant */

const int MAX_N = 200000;
enum {Draw, Win, Lose};
const char ss[3][8] = {"Draw", "Alice", "Bob"};

/* typedef */

using vi = vector<int>;
using qi = queue<int>;

/* global variables */

vi nbrs[MAX_N], rnbrs[MAX_N];
int pns[MAX_N], fs[MAX_N];

/* subroutines */

/* main */

int main() {
  int n, m;
  scanf("%d%d", &n, &m);
  for (int i = 0; i < m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    u--, v--;
    nbrs[u].push_back(v);
    rnbrs[v].push_back(u);
    pns[u]++;
  }

  qi q;
  for (int u = 0; u < n; u++)
    if (pns[u] == 0) q.push(u);

  fill(fs, fs + n, Draw);
  while (! q.empty()) {
    int u = q.front(); q.pop();

    int wc = 0;
    for (auto v: nbrs[u]) {
      if (fs[v] == Lose) { fs[u] = Win; break; }
      else if (fs[v] == Win) wc++;
    }
    if (wc == nbrs[u].size()) fs[u] = Lose;
    
    for (auto v: rnbrs[u])
      if (--pns[v] == 0 || fs[u] == Lose) q.push(v);
  }

  puts(ss[fs[0]]);
  
  return 0;
}

0