首页 > 其他分享 >洛谷 P1983 [NOIP2013 普及组] 车站分级(拓扑排序)

洛谷 P1983 [NOIP2013 普及组] 车站分级(拓扑排序)

时间:2024-10-18 18:18:14浏览次数:12  
标签:洛谷 int 车站 拓扑 flag P1983 NOIP2013 排序 1001

题目传送门

解题思路

对于每一趟列车,我们可以知道其中没有经过的车站的级别肯定会比经过的车站的级别低。

于是,我们可以根据这种关系来建一个图。

将等级小的车站往等级大的车站建边。

于是,我们可以发现这是一个 DAG (有向无环图),

所以我们可以拓扑排序。

我们从等级最小的车站开始(也就是入度为 0 的车站),进行拓扑排序,每次记录经过的车站数量,然后找出最大等级的车站就可以了。

代码

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

int n,m;
int a[1001],flag[1001];
bool lt[1001][1001];
vector<int> g[1001];
int d[1001],ans;
void tuopu()//拓扑排序 
{
	queue<pair<int,int> > q;
	for(int i=1;i<=n;i++)
	{
		if(d[i]==0)
			q.push(make_pair(i,1));
	}
	ans=1;
	while(!q.empty())
	{
		int u=q.front().first;
		int v=q.front().second;
		q.pop();
		for(auto y:g[u])
		{
			d[y]--;
			if(d[y]==0)
			{
				q.push(make_pair(y,v+1));
				ans=max(ans,v+1);
			}
		}
	}
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	
	cin>>n>>m;
	int l;
	for(int i=1;i<=m;i++)
	{
		cin>>l;
		memset(flag,0,sizeof flag);
		for(int j=1;j<=l;j++)
		{
			cin>>a[j];
			flag[a[j]]=1;//标记经过了的车站 
		}
		for(int j=a[1];j<=a[l];j++)
		{
			if(!flag[j])
			{
				for(int k=1;k<=l;k++)
				{
					if(!lt[j][a[k]])//判断是否有重复加边 
					{
						lt[j][a[k]]=1;//从没有经过的车站往经过的车站建图 
						g[j].push_back(a[k]);
						d[a[k]]++;
					}
				}
			}
		}
	}
	
	tuopu();
	
	cout<<ans;
	return 0;
}

标签:洛谷,int,车站,拓扑,flag,P1983,NOIP2013,排序,1001
From: https://blog.csdn.net/2403_87021226/article/details/143056728

相关文章

  • 洛谷 P8572 [JRKSJ R6] Eltaw 做题记录
    zhr随机跳题跳到的,遂做之。注意到\(nk\le5\times10^5\),考虑根号分治。当\(n\)很大时,\(k\)会很小,于是我们记录每一行的前缀和,每一次循环\(k\)个数组的前缀和取\(\max\)即可,时间复杂度\(O(qk)\)。当\(k\)很大时,\(n\)会很小,我们暴力预处理区间\([l,r]\)的最大值,......
  • 洛谷 P2886 [USACO07NOV] Cow Relays G 做题记录
    设矩阵\(M^1=\begin{bmatrix}dis_{1,1}&\dots&dis_{1,n}\\\vdots&\ddots&\vdots\\dis_{1,n}&\cdots&dis_{n,n}\end{bmatrix}\),其中\(dis_{i,j}\)表示\(i\)是否能在\(1\)步内走到\(j\)。让我们回忆一下矩阵乘法,\(c_{i,j......
  • 洛谷题单指南-字符串-P2922 [USACO08DEC] Secret Message G
    原题链接:https://www.luogu.com.cn/problem/P2922题意解读:已知M个01串,给出N个01串,对于N个串的每一个,求在M个串中有多少与其有公共前缀,且前缀长度是两个串中较小者。解题思路:用Trie树存储M个01串,用cnt1[]记录某个节点结束的01串个数,cnt2[]记录经过某个节点的01串的数量对于N个0......
  • 洛谷题单指南-字符串-P2375 [NOI2014] 动物园
    原题链接:https://www.luogu.com.cn/problem/P2375题意解读:计算字符串所有子串的不重叠相同前后缀数量。解题思路:1、KMP+暴力通过Next数组,可以计算所有子串相同前后缀的数量然后枚举Next数组,通过回跳Next[j]、Next[Next[j]-1]、Next[Next[Next[j]-1]-1]......来统计长度小于......
  • 20241016每日一题洛谷P1115
    普及-洛谷P1115最大子段和读题可知需要在一段一维数组中寻找一段唯一的区间,使区间内的数和最大,即寻找和最大区间可以想到前缀和的算法假设输入数组a[n]则前缀和数组b[n]=b[n-1]+a[n]那么从什么时候开始的一段区间才能使区间内的数和最大?从前缀和数组逐步来判断这一条......
  • 洛谷题单指南-字符串-P3435 [POI2006] OKR-Periods of Words
    原题链接:https://www.luogu.com.cn/problem/P3435题意解读:定义字符串a是b的周期,当a是b的真前缀,且b是aa的前缀。给定字符串s,求s每一个前缀的最大周期长度之和。解题思路:针对字符串babababa进行样例模拟:前缀子串  最大周期  周期长度b空0ba空0babba2......
  • 洛谷 P5175 数列 题解
    纯纯数学题。看到\(n\le10^{18}\)不难想到矩乘,但是\(\log_210^{18}\approx60\),再加上\(T=30000\)的多测,运算量已经来到了\(1.8\times10^6\),所以我们最多有一个\(\sqrt[3]{\frac{1.5\times10^8}{6\times10^6}}\approx4\)的矩阵。\[\becausea_i=xa_{i-1}+ya_{......
  • 洛谷题单指南-字符串-Test
    原题链接:https://www.luogu.com.cn/problem/CF25E https://codeforces.com/contest/25/problem/E题意解读:给定a,b,c三个字符串,求包含a、b、c的最短字符串长度。解题思路:要得到包含a、b、c的字符串,可以通过a、b、c连接形成,而要使得连接后的字符串最短,可以尽可能的利用重叠部分......
  • 洛谷题单指南-字符串-P1470 [USACO2.3] 最长前缀 Longest Prefix
    原题链接:https://www.luogu.com.cn/problem/P1470题意解读:求s最长前缀长度,使得可以拆解成p集合中的字符串解题思路:动态规划:设s字符串下标从1开始,p集合用set<string>保存所有的元素状态表示:设f[i]表示前i个字符s[0~i-1]是否能拆解成p中的元素状态计算:对于j=i-1开始往后倒......
  • 洛谷P1638逛画展
    逛画展题目链接题目描述博览馆正在展出由世上最佳的\(m\)位画家所画的图画。游客在购买门票时必须说明两个数字,\(a\)和\(b\),代表他要看展览中的第\(a\)幅至第\(b\)幅画(包含\(a,b\))之间的所有图画,而门票的价钱就是一张图画一元。Sept希望入场后可以看到所有名师的图......