洛谷P1983車站分級題解
阿新 • • 發佈:2019-01-04
這個題非常毒瘤,只要還是體現在其思維難度上,因為要停留的車站的等級一定要大於不停留的車站的等級,因此我們可以從不停留的車站向停留的車站進行連邊,然後從入度為0的點即不停留的點全都入隊,然後拓撲排序即可
程式碼
#include <bits/stdc++.h> #pragma GCC optimize(2) #pragma GCC optimize(3) using namespace std; int in[199091], lin[100100], dep[100100], data[100100], vis[10001], cnt, n, m, ans, b[4010][4010]; struct edge { int to, nex; }e[1000100]; inline void add(int a, int b) { e[++cnt].to = b; e[cnt].nex = lin[a]; lin[a] = cnt; in[b]++; } inline void topu() { queue <int> q; for (int i = 1; i <= n; i++) if (!in[i]) q.push(i), dep[i] = 1; while (!q.empty()) { int cur = q.front(); q.pop(); for (int i = lin[cur]; i; i = e[i].nex) { int to = e[i].to; dep[to] = dep[cur] + 1; ans = max(ans, dep[to]); in[to]--; if (!in[to]) q.push(to); } } printf("%d", ans); } int main() { scanf("%d%d", &n, &m); for (int i = 1; i <= m; i++) { int a; memset(data, 0, sizeof(data)); memset(vis, 0, sizeof(vis)); scanf("%d", &a); for (int j = 1; j <= a; j++) scanf("%d", &data[j]), vis[data[j]] = 1; for (int k = data[1] + 1; k <= data[a]; k++) if (!vis[k]) for (int l = 1; l <= a; l++) if (!b[k][data[l]]) b[k][data[l]] = 1, add(k, data[l]); } topu(); return 0; }