首页 > 其他分享 >洛谷题单指南-图的基本应用-P1983 [NOIP2013 普及组] 车站分级

洛谷题单指南-图的基本应用-P1983 [NOIP2013 普及组] 车站分级

时间:2024-04-07 09:02:07浏览次数:25  
标签:NOIP2013 停靠站 int 洛谷题 拓扑 P1983 停靠 车站 级别

原题链接:https://www.luogu.com.cn/problem/P1983

题意解读:由于“如果这趟车次停靠了火车站x,则始发站、终点站之间所有级别大于等于火车站x的都必须停靠”。因此,在始发站和终点站之间,能停靠的车站都是级别较高的,没有停靠的车站都是级别较低的,计算最少有多少个不同级别。

解题思路:

有若干车站可以是同一个级别,如未停靠的车站都可以设置同样的低级别,停靠的车站根据相关关系也可以划分不同的级别,可以通过建图形成层级关系。

由于停靠的车站都是级别较高的,未停靠的车站都是级别较低的,所以对于起点、终点之间每一个未停靠的车站,可以建立一条指向停靠车站的边

对样例进行模拟

9 2 
4 1 3 5 6 
3 3 5 6

图中2、4是未停靠站,可以设定同样的级别,1、3、5、6是停靠站,也可以设定同样的级别,因此一共只需要2个级别。

在图形结构中,2、4是拓扑排序的第一层,1、3、5、6是拓扑排序的第二层。

有了这个设想,在用另外一个样例进行模拟,验证是否正确

9 3 
4 1 3 5 6 
3 3 5 6 
3 1 5 9

上图中,2、4、7、8是拓扑排序的第一层、3、6是拓扑排序的第二层,1、5、9是拓扑排序的第三层,因此一共只需要3个级别。

此方法验证成立。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1005;

int g[N][N]; //邻接矩阵,便于处理重边的情况
int n, m, s, a[N], b[N]; //a[i]存储所有停靠点 b[i]=1表示在第i站停靠
int in[N];
int depth[N], ans = 1; 

//通过拓扑排序,计算每个节点所在的深度,最大深度即不同的级别数
void bfs()
{
    queue<int> q;
    for(int i = 1; i <= n; i++)
    {
        if(in[i] == 0)
        {
            q.push(i);
            depth[i] = 1; //初始节点的深度
        } 
    }
    while (q.size())
    {
        int u = q.front(); q.pop();
        for(int v = 1; v <= n; v++)
        {
            if(g[u][v] == 1)
            {            
                if(--in[v] == 0)
                {
                    q.push(v);
                    depth[v] = depth[u] + 1;
                    ans = max(ans, depth[v]);
                } 
            }
        }
    }
    
}

int main()
{
    cin >> n >> m;
    while(m--)
    {
        cin >> s;
        memset(a, 0, sizeof(a)); 
        memset(b, 0, sizeof(b)); 
        for(int i = 1; i <= s; i++)
        {
            cin >> a[i]; //所有停靠站
            b[a[i]] = 1; //停靠站和非停靠站
        }
        for(int i = a[1]; i <= a[s]; i++) //遍历起点到终点之间的站
        {
            if(b[i] == 0)//取未停靠站
            {
                for(int j = 1; j <= s; j++) //遍历每一个停靠站a[j]
                {                
                    if(g[i][a[j]] == 0) in[a[j]]++; //记录入度,去重边
                    g[i][a[j]] = 1; //所有未停靠站和所有停靠站之间建立边
                }
            }
        }
    }
    bfs();
    cout << ans;
    return 0;
}

 

标签:NOIP2013,停靠站,int,洛谷题,拓扑,P1983,停靠,车站,级别
From: https://www.cnblogs.com/jcwy/p/18118043

相关文章

  • 洛谷题单指南-图的基本应用-P1347 排序
    原题链接:https://www.luogu.com.cn/problem/P1347题意解读:在给出多对关系字母的比较关系之后,判断能否确定所有字母的顺序。解题思路:对字母的关系建立图,如A<B建立A指向B的一条边。如果在拓扑排序过程中,每次寻找入度为0的点只有一个,且最终可以形成拓扑序,则可以确定所有字母的顺......
  • 洛谷题单指南-图的基本应用-P1363 幻象迷宫
    原题链接:题意解读:迷宫可以无限扩展,对第一个样例进行模拟,扩展4块的示意图:从起点S,沿着红色虚线,是可以无限走下去的,要判断是否能够无限走下去。解题思路:直观上,会考虑把迷宫复制多块,但是会面临2个问题:1、内存可能爆掉2、如何有效判断可以无限走下去?只考虑竖向或者横向连通是不......
  • P1967 [NOIP2013 提高组] 货车运输 题解
    P1967[NOIP2013提高组]货车运输原题地址思路:由于题目要求的是使两点之间的最小边权最大,所以可以构造最大生成树(最大生成树一定是最大瓶颈生成树,而瓶颈生成树上两点之间的路径,在原图中的所有路径中,最小边权仍然最大,即满足题目要求,详见https://oi-wiki.org/graph/mst/#性质),......
  • 洛谷题单指南-图的基本应用-P2853 [USACO06DEC] Cow Picnic S
    原题链接:https://www.luogu.com.cn/problem/P2853题意解读:找到所有奶牛都可以到达的牧场,就是要从奶牛所在位置开始遍历,求所有奶牛能重合的点的个数。解题思路:直接从从牛奶所在位置进行DFS,记录每个位置有奶牛能到的个数,个数等于奶牛总数的即合适的牧场。100分代码:#include<bi......
  • 洛谷题单指南-图的基本应用-P1127 词链
    原题链接:https://www.luogu.com.cn/problem/P1127题意解读:按字典序排列单词,使得相邻单词的首位字母一样。解题思路:由于单词之间可以相邻的条件是前一个单词的末尾字母和后一个单词的开头字母一样,因此可以遍历每一个单词,再找到每一个可以接在其后面的单词,建立一个邻接表,然后从......
  • 洛谷题单指南-图的基本应用-P1807 最长路
    原题链接:https://www.luogu.com.cn/problem/P1807题意解读:由于对于每一条边u->v,都有u<v,因此节点1的入度一定是0,且是有向无环图,直观上可以通过拓扑排序法搜索每一个节点,计算1到每一个节点的最长距离。但问题在于,入度为0的节点可能不止一个,这样在计算到某个点的最长距离时,会受到......
  • 洛谷题单指南-图的基本应用-P4017 最大食物链计数
    原题链接:https://www.luogu.com.cn/problem/P4017题意解读:食物链的顶端不会被其他生物吃,在图结构中设定为入度是0,食物链的底端不会吃其他生物,在图结构式设定为出度是0,此题就是要计算所有入度是0的点到所有出度是0的点一共有多条路径。解题思路:首先,来模拟一样样例,样例数据形成的......
  • 洛谷题单指南-图的基本应用-P3916 图的遍历
    原题链接:https://www.luogu.com.cn/problem/P3916题意解读:寻找每个点所能到达的最大的点。解题思路:直观上,可以依次从每个点开始DFS搜索,记录经过的最大点,复杂度是O(n^2)级别,会超时。可以换一种角度,既然要找每个点可以达到的最大值,那么可以反向建图,从最大值出发,所经过的点能达到......
  • 洛谷题单指南-图的基本应用-P5318 【深基18.例3】查找文献
    原题链接:https://www.luogu.com.cn/problem/P5318题意解读:图的建立、DFS、BFS模版题。解题思路:本题主要考察建图、图的DFS、BFS遍历。建图方式:领接表vector<int>g[N];需要注意的是,在DFS、BFS搜索领接点时,需要先将领接点编号排序,满足题目要求的“如果有很多篇文章可以参阅,请......
  • 洛谷题单指南-集合-P2814 家谱
    原题链接:https://www.luogu.com.cn/problem/P2814题意解读:已知多组父子关系,找某个人最早的祖先,并查集的应用。解题思路:由于存在真正的父子关系,所以在并查集合并的时候,要把p[x]=y中x设置为子,y设置为父,其余都是并查集的常规操作。由于是计算姓名之间的父子关系,并查集可以用map......