1. 程式人生 > 其它 >洛谷 P1983 [NOIP2013 普及組] 車站分級

洛谷 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) (1im)中,首先是一個正整數 s i ( 2 ≤ s i ≤ n ) s_i(2 ≤ s_i ≤ n) si(2sin),表示第 i i i 趟車次有 s i s_i si個停靠站;接下來有 s i s_i si個正整數,表示所有停靠站的編號,從小到大排列。每兩個數之間用一個空格隔開。輸入保證所有的車次都滿足要求。

輸出格式

一個正整數,即 nn 個火車站最少劃分的級別數。

輸入輸出樣例

輸入
9 2
4 1 3 5 6

3 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 1n,m10

對於 50 % 50\% 50%的資料, 1 ≤ n , m ≤ 100 1 ≤ n, m ≤ 100 1n,m100

對於 100 % 100\% 100%的資料, 1 ≤ n , m ≤ 1000 1 ≤ n, m ≤ 1000 1n,m1000

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); }