2 条题解

  • 2
    @ 2023-2-7 15:16:04

    原本要连n×n条边。

    但是,如果在中间添加一个虚点,就可以变成2n条边:

    AC代码

    #include <bits/stdc++.h>
    using namespace std; 
    int n,m,ans,a[2003],s,i,j,u,to[2003][2003],uans[2003],sto[2003];
    void dfs(int u)
    {
        if (uans[u])
            return;
        for(int i=1;i<=to[u][0];i++)
        {
            if(!uans[to[u][i]])
                dfs(to[u][i]);
            uans[u]=max(uans[u],uans[to[u][i]]+1);
        }
        if(u>n)
            uans[u]--;
        ans=max(ans,uans[u]);
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for (i=1;i<=m;i++)
        {
            scanf("%d",&s);
            for (j=1;j<=s;j++)
                scanf("%d",&a[j]),sto[a[j]]=i,to[n+i][++to[n+i][0]]=a[j];
            for (u=a[1]+1;u<a[s];u++) 
                if (sto[u]!=i)
                     to[u][++to[u][0]]=n+i;    
        }
        for (i=1;i<=n;i++) 
            if (!uans[i])
                dfs(i);
        printf("%d",++ans);
        return 0;
    }
    
    • 1
      @ 2024-4-17 17:40:32

      图论

      #include<bits/stdc++.h>
      #define FOR(x,y) for(int i=x;i<=y;i++)
      using namespace std;
      const int mod = 998244353; 
      const int N = 1e6;
      int n,m,l,p,maxx;
      int a[N],d[N],f[N],vi[2000][2000],c[2000][2000];
      int dfs(int x){
      	if(f[x]) return f[x];
      	FOR(1,c[x][0]) f[x]=max(f[x],dfs(c[x][i]));
      	return ++f[x];
      }int main(){
      	cin>>n>>m;
      	FOR(1,m){
      		l=1;
      		cin>>p;
      		for(int j=1;j<=p;j++) cin>>a[j];
      		for(int j=a[1];j<a[p];j++){
      			if(a[l]==j) l++;
      			else{
      				for(int k=1;k<=p;k++){
      					if(!vi[a[k]][j]){
      						c[a[k]][++c[a[k]][0]]=j;
      						vi[a[k]][j]=1;
      					}
      				}
      			}
      		}
      	} for(int i=1;i<=n;i++) maxx=max(maxx,dfs(i));
      	cout<<maxx;
      }
      
      • 1

      信息

      ID
      1484
      时间
      1000ms
      内存
      256MiB
      难度
      2
      标签
      递交数
      35
      已通过
      23
      上传者