洛谷1983

我是采用一层一层更新的方法,对于当前列车,在他走的区间内,找到没有停靠的站点的最大值Max。然后将所有停靠的站点和Max比较,如果有站点的级别不高于Max,就给这个站点的级别赋值为Max+1。开始我只是遍历了一遍所有的列车,就wa了,应该在重复遍历,用flag标记,直到没有跟新站点的级别就可以break了。

其实和拓扑排序的思想差不多,但是自己确实没想到拓扑排序。。。

#include <bits/stdc++.h>                                                                                                 
using namespace std;
#define res register int 
#define inf 0x3f3f3f3f
const int maxn=1005;
vector<int> v[maxn];
int num[maxn];
int vis[maxn];
int N,M;
int ans=0;
void slove()
{
	while(1){
		int flag=1;
		for(res i=0;i<M;i++){
		int size=v[i].size();
		for(res j=0;j<size;j++)//对于本次出现的数据进行标记 
			vis[v[i][j]]=1;
		int Max=-inf;
		for(res j=v[i][0]+1;j<v[i][size-1];j++)
			if(!vis[j])	Max=max(Max,num[j]);
		for(res j=v[i][0];j<=v[i][size-1];j++){
			if(vis[j]&&Max>=num[j]){
				num[j]=Max+1;
				flag=0;
			} 
		} 
		for(res j=0;j<size;j++)//褪去标记 
			vis[v[i][j]]=0; 
		}	 
		if(flag) break;
	} 

}

void init()
{
	scanf("%d%d",&N,&M);
	int cnt,to;
	for(res i=0;i<M;i++){
		scanf("%d",&cnt);
		for(res j=0;j<cnt;j++){
			scanf("%d",&to);
			v[i].push_back(to);
		} 
	}
		
} 

int main()
{
	init();
	slove();
	int Max=-inf;
	for(res i=1;i<=N;i++)
		Max=max(Max,num[i]);
	printf("%d",Max+1);
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/qq_41755258/article/details/84976638