【洛谷P1983】车站分级

车站分级

题目链接

首先,可以发现火车停靠站点的大小是没有什么规律的,

火车可以停靠在级别<=当前级别的站点,必须停靠在级别>=当前最高级别的站点

但是所有没有被停靠的站点级别一定比所有被停靠了的站点级别低

于是就可以据此建一个DAG,拓扑排序或记搜即可

(O(n^3)建图居然过了

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<bitset>
 5 using namespace std;
 6 #define rep(i,l,r) for(int i=l;i<=r;i++)
 7 #define reset(a) fill(a,a+n+1,0)
 8 #define N 1010
 9 int n,m,Head[N],num,a[N],tot,f[N],ans;
10 bitset<N> line[N];
11 struct NODE{
12     int to,next;
13 } e[10000010];
14 bool vis[N];
15 inline int read(){
16     int x=0; char c=getchar();
17     while(c<'0'||c>'9') c=getchar();
18     while('0'<=c&&c<='9') { x=(x<<3)+(x<<1)+c-'0'; c=getchar(); }
19     return x;
20 }
21 inline void add(int x ,int y){
22     e[++num].to=y;
23     e[num].next=Head[x];
24     Head[x]=num;
25 }
26 int dfs(int t){
27     if(f[t]) return f[t];
28     for(int i=Head[t];i;i=e[i].next)
29      f[t]=max(f[t],dfs(e[i].to));
30     return ++f[t];
31 }
32 int main()
33 {
34     scanf("%d%d",&n,&m);
35     int x,y;
36     rep(i,1,m){
37         tot=0;
38         reset(vis); reset(a);
39         x=read();
40         while(x--){
41             a[++tot]=read();
42             vis[a[tot]]=1;
43         }
44         rep(j,a[1],a[tot]) if(!vis[j])
45          rep(k,1,tot) if(!line[j][a[k]])
46           { add(j,a[k]); line[j][a[k]]=1; }
47     }
48     for(int i=1;i<=n;i++){
49         if(!f[i]) dfs(i);
50         ans=max(ans,f[i]);
51     }
52     printf("%d\n",ans);
53     return 0;
54 } 

 

posted @ 2018-08-03 15:53  yjk  阅读(130)  评论(0编辑  收藏  举报