2 条题解
-
2
原本要连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
图论
#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
- 上传者