这个复杂度不对吧?但是AC了
查看原帖
这个复杂度不对吧?但是AC了
1164775
Jadonyzx楼主2024/9/19 09:44

暴力连边跑拓扑,应该是 n2m4\frac{n^2m}4

#include<bits/stdc++.h>
#define maxn 1001
using namespace std;
int n,m,indgr[maxn],level[maxn],ans=1,s[maxn],up[maxn],down[maxn],topup,topdown;
bool edge[maxn][maxn];queue<int>q;
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;++i){
		int len;cin>>len;topup=topdown=0;
		for(int j=1;j<=len;++j)cin>>s[j];
		int res=s[1];
		for(int j=1;j<=len;++j){
			up[++topup]=s[j];
			if(s[j]-1>res)for(int k=res+1;k<s[j];++k)down[++topdown]=k;
			res=s[j];
		}
		for(int j=1;j<=topup;++j){
			for(int k=1;k<=topdown;++k){
				if(!edge[down[k]][up[j]])indgr[up[j]]++;
				edge[down[k]][up[j]]=1;
			}
		}
	}
	for(int i=1;i<=n;++i)level[i]=1;
	for(int i=1;i<=n;++i)if(indgr[i]==0)q.push(i);
	while(q.size()){
		int now=q.front();q.pop();
		for(int i=1;i<=n;++i){
			int v=edge[now][i];
			if(v)v=i;
			else continue;
			if(level[v]<=level[now])
				level[v]=level[now]+1;
			indgr[v]--;
			if(indgr[v]==0)q.push(v);
		}
	}
	for(int i=1;i<=n;++i)ans=max(ans,level[i]);
	cout<<ans;
	return 0;
}
2024/9/19 09:44
加载中...