zoukankan      html  css  js  c++  java
  • 【noip 2013】车站分级

    题目描述

    一条单向的铁路线上,依次有编号为 1, 2, …, n 的 n 个火车站。每个火车站都有一个级别,最低为 1 级。现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车站 x,则始发站、终点站之间所有级别大于等于火车站 x 的都必须停靠。(注意:起始站和终点站自然也算作事先已知需要停靠的站点)
    例如,下表是 5 趟车次的运行情况。其中,前 4 趟车次均满足要求,而第 5 趟车次由于停靠了 3 号火车站(2 级)却未停靠途经的 6号火车站(亦为 2 级)而不满足要求。
     
    现有 m 趟车次的运行情况(全部满足要求) ,试推算这 n 个火车站至少分为几个不同的
    级别。
    【输入】
    输入文件为 level.in。
    第一行包含 2 个正整数 n, m,用一个空格隔开。
    第 i + 1 行(1 ≤ i ≤ m)中,首先是一个正整数 si (2 ≤ si≤ n),表示第 i 趟车次有 si 个停靠站;接下来有 si 个正整数,表示所有停靠站的编号,从小到大排列。每两个数之间用一个空格隔开。输入保证所有的车次都满足要求。
    【输出】
    输出文件为 level.out。
    输出只有一行,包含一个正整数,即 n 个火车站最少划分的级别数。

    输入输出样例

    输入样例#1:
    9 2 
    4 1 3 5 6 
    3 3 5 6 
    输出样例#1:
    2
    输入样例#2:
    9 3 
    4 1 3 5 6 
    3 3 5 6 
    3 1 5 9 
    输出样例#2:
    3

    说明

    对于 20%的数据,1 ≤ n, m ≤ 10;

    对于 50%的数据,1 ≤ n, m ≤ 100;

    对于 100%的数据,1 ≤ n, m ≤ 1000。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 #include<algorithm>
     5 #define maxn 1001
     6 using namespace std;
     7 bool a[1001],f[1001],e[1001][1001];
     8 int r[1001],b[1001],sk[1001];
     9 int main(){
    10     int n,m,s;
    11     cin>>n>>m;
    12     for(int i=1;i<=m;i++){
    13         memset(a,0,sizeof(a));
    14         cin>>s;
    15         for(int j=1;j<=s;j++){
    16             cin>>b[j];
    17             a[b[j]]=1;
    18         }
    19         for(int j=b[1];j<=b[s];j++)
    20             if(!a[j])
    21                 for(int k=1;k<=s;k++){
    22                     if(!e[j][b[k]]){
    23                         e[j][b[k]]=1;
    24                         r[b[k]]++;
    25                     }
    26                 }
    27     }
    28     int ans=0,top;
    29     while(1){
    30         top=0;
    31         for(int i=1;i<=n;i++)
    32             if(!r[i]&&!f[i]){
    33                 sk[++top]=i;
    34                 f[i]=1;
    35             }
    36         if(top==0) break;
    37         for(int j=1;j<=top;j++){
    38             for(int i=1;i<=n;i++){
    39                 if(e[sk[j]][i]){
    40                     e[sk[j]][i]=0;
    41                     r[i]--;
    42                 }
    43             }
    44         }
    45         ans++;
    46     }
    47     cout<<ans<<"
    ";
    48     return 0;
    49 }
     
  • 相关阅读:
    创建或者连接管道+++检查管道空间是否够写入本消息++++删除管道
    从instr中截取第一个delimiter之前的内容放到outstr中,返回第一个delimiter之后的位置
    把数字按网络顺序或主机顺序存放到字符串中++++把字符串按网络顺序转换成数字++++把字符串按主机顺序转换成数字
    压缩空格的函数以及BCD码与ASCII相互转换函数
    判断文件是否存在
    把指定长度字符串转换成数字
    找到特定串在源字符串中的位置
    FTP命令详解
    docker 学习路线
    云原生技术的了解
  • 原文地址:https://www.cnblogs.com/Emine/p/7617680.html
Copyright © 2011-2022 走看看