zoukankan      html  css  js  c++  java
  • Luogu P1983 车站分级

    题目描述

      一条单向的铁路线上,依次有编号为1,2,...,n的n个火车站。每个火车站都有一个级别,最低为1级。现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车站x,则始发站、终点站之间所有级别大于等于火车站x的都必须停靠。(注意:起始站和终点站自然也算作事先已知需要停靠的站点)例如,下表是5趟车次的运行情况。其中,前4趟车次均满足要求,而第5趟车次由于停靠了3号火车站(2级)却未停靠途经的6号火车站(亦为2级)而不满足要求。

    Failed to load picture

      现有m趟车次的运行情况(全部满足要求),试推算这n个火车站至少分为几个不同的级别。

     

    输入格式

      第一行包含2个正整数n,m,用一个空格隔开。

      第i+1行(1≤i≤m)中,首先是一个正整数si(2≤si≤n),表示第i趟车次有si个停靠站;接下来有si个正整数,表示所有停靠站的编号,从小到大排列。每两个数之间用一个空格隔开。输入保证所有的车次都满足要求。

     

    输出格式

      一行,包含一个正整数,即n个火车站最少划分的级别数。

     

    输入样例一

    9 2

    4 1 3 5 6

    3 3 5 6

     

    输出样例一

    2

     

    输入样例二

    9

    4 1 3 5 6

    3 3 5 6

    3 1 5 9

     

    输出样例二

    3

    数据规模

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

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

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

    题解

      我们可以把车站看作点,整个车站系统看作一张图。

      根据级别低的停靠时,级别相比更高的也要停靠,可以想到拓扑排序,级别高的对级别相对更低的连上一条有向边。

      我们不知道哪些车站级别高,哪些车站级别低,我们就对于每一个车次,让停靠站向非停靠站连边,最后拓扑排序即可。

    #include <iostream> 
    #include <queue>
    #define MAX_N 1001
    #define MAX_M 1001
    
    using namespace std;
    
    int n, m;
    int a[MAX_M][MAX_N];
    bool f[MAX_N][MAX_N];
    int d[MAX_N];
    int ans = 1;
    
    int main()
    {
        cin >> n >> m;
        for(register int i = 1; i <= n; ++i) d[i] = -1;
        for(register int i = 1; i <= m; ++i)
        {
            cin >> a[i][0];
            for(register int j = 1; j <= a[i][0]; ++j)
            {
                cin >> a[i][j];
            }
            for(register int j1 = 1, j2 = a[i][1]; j2 <= a[i][a[i][0]]; ++j2)
            {
                if(d[j2] == -1) d[j2] = 0;
                if(a[i][j1] == j2)
                {
                    ++j1;
                    continue;
                }
                for(register int k = 1; k <= a[i][0]; ++k)
                {
                    if(!f[a[i][k]][j2]) 
                    {
                        d[j2]++;
                    }
                    f[a[i][k]][j2] = 1;
                }
            }
        }
        queue<int> q;
        for(register int i = 1; i <= n; ++i)
        {
            if(!d[i])
            {
                q.push(i);
            }
        }
        while(!q.empty()) for(register int flag = 0, I = q.size(); I >= 1; --I)
        {
            int now = q.front();
            q.pop();
            for(register int i = 1; i <= n; i++)
            {
                if(d[i] > 0)
                {
                    if(f[now][i]) f[now][i] = 0, d[i]--;
                    if(!d[i]) 
                    {
                        q.push(i);
                        if(!flag) ++ans, flag = 1;
                    }
                }
            }    
        }
        cout << ans;
        return 0;
    }
    参考程序
  • 相关阅读:
    Netty之ProtoBuf(六)
    Netty对WebSocket的支持(五)
    Netty之心跳检测技术(四)
    Netty之多用户的聊天室(三)
    Docker Compose 笔记
    vue.js学习笔记
    powerdesigner 生成C#code 实体 模板设备
    .net 接收post 的参数 加载xml
    powerdesigner 生成实体代码 附加生成xml
    PostgreSql 获取所有的表、视图、字段、 主键
  • 原文地址:https://www.cnblogs.com/kcn999/p/11190038.html
Copyright © 2011-2022 走看看