洛谷 P1983 [NOIP2013 普及組] 車站分級
技術標籤:洛谷
題目描述
一條單向的鐵路線上,依次有編號為 1 , 2 , … , n 1, 2, …, n 1,2,…,n的 n n n個火車站。每個火車站都有一個級別,最低為 1 級。現有若干趟車次在這條線路上行駛,每一趟都滿足如下要求:如果這趟車次停靠了火車站 x,則始發站、終點站之間所有級別大於等於火車站 x 的都必須停靠。(注意:起始站和終點站自然也算作事先已知需要停靠的站點)
例如,下表是 5趟車次的執行情況。其中,前 4 趟車次均滿足要求,而第 5 趟車次由於停靠了 3 號火車站(2 級)卻未停靠途經的 6 號火車站(亦為 2 級)而不滿足要求。
現有 m 趟車次的執行情況(全部滿足要求),試推算這 n 個火車站至少分為幾個不同的級別。
輸入格式
第一行包含 2 個正整數 n,m,用一個空格隔開。
第 i + 1 i + 1 i+1 行 ( 1 ≤ i ≤ m ) (1 ≤ i ≤ m) (1≤i≤m)中,首先是一個正整數 s i ( 2 ≤ s i ≤ n ) s_i(2 ≤ s_i ≤ n) si(2≤si≤n),表示第 i i i 趟車次有 s i s_i si個停靠站;接下來有 s i s_i si個正整數,表示所有停靠站的編號,從小到大排列。每兩個數之間用一個空格隔開。輸入保證所有的車次都滿足要求。
輸出格式
一個正整數,即 nn 個火車站最少劃分的級別數。
輸入輸出樣例
輸入
9 2
4 1 3 5 6
輸出
2
輸入
9 3
4 1 3 5 6
3 3 5 6
3 1 5 9
輸出
3
說明/提示
對於 20 % 20\% 20%的資料, 1 ≤ n , m ≤ 10 1 ≤ n, m ≤ 10 1≤n,m≤10;
對於 50 % 50\% 50%的資料, 1 ≤ n , m ≤ 100 1 ≤ n, m ≤ 100 1≤n,m≤100;
對於 100 % 100\% 100%的資料, 1 ≤ n , m ≤ 1000 1 ≤ n, m ≤ 1000 1≤n,m≤1000。
AC的C++程式碼
#include<iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
const int N = 1002;
int n, m, i, j, a[N], d[N], ans, f[N], k, vi[N][N], c[N][N], t;
int dfs(int x) {
if (f[x]) return f[x];
for (int i = 1; i <= c[x][0]; i++) f[x] = max(f[x], dfs(c[x][i]));
return ++f[x];
}
int main() {
scanf("%d%d", &n, &m);
for (i = 1; i <= m; i++) {
scanf("%d", &a[0]);
for (j = 1; j <= a[0]; j++) scanf("%d", &a[j]);
t = 1;
for (j = a[1]; j < a[a[0]]; j++)
if (a[t] == j)
t++;
else {
for (k = 1; k <= a[0]; k++)
if (!vi[a[k]][j]) {
c[a[k]][++c[a[k]][0]] = j;
vi[a[k]][j] = 1;
}
}
}
for (i = 1; i <= n; i++)
ans = max(ans, dfs(i));
printf("%d", ans);
}