結果
| 問題 | 
                            No.1364 [Renaming] Road to Cherry from Zelkova
                             | 
                    
| コンテスト | |
| ユーザー | 
                             siman
                         | 
                    
| 提出日時 | 2022-04-10 03:13:49 | 
| 言語 | C++17(clang)  (17.0.6 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                WA
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 1,790 bytes | 
| コンパイル時間 | 1,332 ms | 
| コンパイル使用メモリ | 127,232 KB | 
| 実行使用メモリ | 27,776 KB | 
| 最終ジャッジ日時 | 2024-11-30 07:44:54 | 
| 合計ジャッジ時間 | 14,745 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge2 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 17 WA * 28 | 
ソースコード
#include <iostream>
#include <stack>
#include <string.h>
#include <vector>
using namespace std;
typedef long long ll;
const ll MOD = 1000000007;
typedef vector <vector<int>> Graph;
typedef vector <vector<ll>> Cost;
typedef vector <vector<ll>> Nums;
vector<int> tsort(Graph G, int start, int end) {
  vector<int> ret;
  int degree[end];
  memset(degree, 0, sizeof(degree));
  for (int from = start; from < end; from++) {
    for (int i = 0; i < G[from].size(); i++) {
      int to = G[from][i];
      degree[to]++;
    }
  }
  stack<int> root;
  for (int i = start; i < end; i++) {
    if (degree[i] == 0) {
      root.push(i);
    }
  }
  while (!root.empty()) {
    int from = root.top();
    root.pop();
    ret.push_back(from);
    for (int i = 0; i < G[from].size(); i++) {
      int to = G[from][i];
      degree[to]--;
      if (degree[to] == 0) {
        root.push(to);
      }
    }
  }
  return ret;
}
int main() {
  int N, M;
  cin >> N >> M;
  Graph G(N + 1);
  Cost C(N + 1);
  Nums D(N + 1);
  int s, t;
  ll l, a;
  for (int i = 0; i < M; ++i) {
    cin >> s >> t >> l >> a;
    G[s].push_back(t);
    C[s].push_back(l);
    D[s].push_back(a);
  }
  vector<int> res = tsort(G, 0, N + 1);
  if (res.size() != N + 1) {
    // tsort failed.
    cout << "INF" << endl;
  } else {
    ll dp_C[N + 1];
    ll dp_D[N + 1];
    memset(dp_C, 0, sizeof(dp_C));
    memset(dp_D, 0, sizeof(dp_D));
    dp_D[0] = 1;
    for (int v : res) {
      int L = G[v].size();
      for (int i = 0; i < L; ++i) {
        int u = G[v][i];
        ll c = C[v][i];
        ll d = D[v][i];
        dp_C[u] += dp_C[v] + dp_D[v] * d * c;
        dp_D[u] += dp_D[v] * d;
        dp_C[u] %= MOD;
        dp_D[u] %= MOD;
      }
    }
    cout << dp_C[N] << endl;
  }
  return 0;
}
            
            
            
        
            
siman