while (!q.empty()) { int u = q.front(); q.pop(); vis[u] = false; if (cnt[u] == n) { //第一次发现点在正环上, 将value[u] 置为 INF value[u] = INF; } elseif (cnt[u] == n + 1) { //第二次发现点在正环上, 直接跳过该点 continue; }
if (u == n) { returntrue; }
for (int e = p[u]; e != -1; e = E[e].next) { int v = E[e].v; if (value[v] < value[u] + w[v]) { value[v] = value[u] + w[v]; if (!vis[v]) { vis[v] = true; q.push(v); cnt[v]++; } } } }
returnfalse; }
intmain(){ int n, k, v; init(); cin >> n; for (int i = 1; i <= n; i++) { cin >> w[i] >> k; while (k--) { cin >> v; insert(i, v); } }