Day 12+13 拓扑
代码如下(示例):
#include<bits/stdc++.h>
using namespace std;
int rd[2000],dis[2000];
int ans;
struct node {
int y,nxt;
}edge[1000005];
bool eve[1005][1005];
int head[2000],tot=0;
void add(int x,int y) {
tot++;
edge[tot].y=y;
edge[tot].nxt=head[x];
head[x]=tot;
}
int a[2000],b[2000],Hash[2000];
void Init()
{
memset(Hash,0,sizeof(Hash));
int n,m=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),Hash[a[i]]=1;
for(int i=a[1];i<=a[n];i++)
if(Hash[i]==0) b[++m]=i;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(!eve[a[i]][b[j]]) {
eve[a[i]][b[j]]=1;
add(a[i],b[j]);
rd[b[j]]=1; }
return ; }
void dfs(int u,int num)
{
if(num<=dis[u]) return ;
dis[u]=num;
for(int i=head[u];i!=-1;i=edge[i].nxt)
dfs(edge[i].y,num+1); }
int main() {
int n,m;
cin>>n>>m;
memset(rd,0,sizeof(rd));
memset(dis,0,sizeof(dis));
memset(eve,0,sizeof(eve));
memset(head,-1,sizeof(head));
for(int i=1;i<=m;i++)
Init();
for(int i=1;i<=n;i++)
if(!rd[i]) dfs(i,1);
for(int i=1;i<=n;i++)
if(dis[i]>ans) ans=dis[i];
cout<<ans;
return 0;}