对于每条线路,所有经过的点,由停靠站点向未停靠点发出一条出边。最后呈现出一个有向无环图,对该图拓扑排序求层级。构造边时需要采用“虚点优化”,不然会超内存。
code:
#include <bits/stdc++.h>
using namespace std;
int n, m;
bool vis[2005];
int a[2005];
int in[2005];
int depth[2005];
vector<int> v[2005];
int main() {
//freopen("in","r",stdin);
scanf("%d%d", &n, &m);
//建图
for (int i = 1; i <= m; i++) {
int k;
scanf("%d", &k);
for (int j = 1; j <= k; j++) {
scanf("%d", &a[j]);
in[n + i]++;
v[a[j]].push_back(n + i);
vis[a[j]] = true;
}
for (int j = a[1]; j <= a[k]; j++) {
if (vis[j])continue;
in[j]++;
v[n + i].push_back(j);
}
for (int j = 1; j <= k; j++) {
vis[a[j]] = false;
}
}
//拓扑排序
queue<int> q;
for (int i = 1; i <= n; i++) {
if (in[i] == 0)q.push(i);
}
int ans = 0;
while (!q.empty()) {
int top = q.front();
q.pop();
ans = max(ans, depth[top]);
for (int i = 0; i < v[top].size(); i++) {
in[v[top][i]]--;
if (in[v[top][i]] == 0) {
depth[v[top][i]] = depth[top] + (v[top][i] <= n);
q.push(v[top][i]);
}
}
}
cout << ans + 1 << endl;
return 0;
}