车站分级
题目
解析
拓扑排序,毫无难度
唯一难的是建图
scanf("%d",&t);
for(int j=1;j<=t;j++)scanf("%d",&o[j]);
k=o[1]+1;
for(int j=2;j<=t;j++)
{
while(k!=o[j])
{
for(int l=1;l<=t;l++)if(!ok[k][o[l]])ok[k][o[l]]=1,add(k,o[l]),in[o[l]]++;
++k;
}
++k;
}
然后就AC了????
…………………………………………………………………………………………………………
code:
#include<cstdio>
#include<queue>
using namespace std;
int k,n,m,head[1010],a[1000010],b[1000010],nxt[1000010],ans[1010],in[1010],tot=0,t,o[1010];
queue <int> c;
bool ok[1010][1010];
void add(int x,int y)
{
a[++tot]=x,b[tot]=y,nxt[tot]=head[x],head[x]=tot;
}
void topo()
{
while(!c.empty())
{
k=c.front(),c.pop();
for(int i=head[k];i;i=nxt[i])
{
if(ans[b[i]]<=ans[k])ans[b[i]]=ans[k]+1;
in[b[i]]--;
if(in[b[i]]==0)c.push(b[i]);
}
}
return;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&t);
for(int j=1;j<=t;j++)scanf("%d",&o[j]);
k=o[1]+1;
for(int j=2;j<=t;j++)
{
while(k!=o[j])
{
for(int l=1;l<=t;l++)if(!ok[k][o[l]])ok[k][o[l]]=1,add(k,o[l]),in[o[l]]++;
++k;
}
++k;
}//蜜汁建图
}
for(int i=1;i<=n;i++)if(in[i]==0)c.push(i),ans[i]=1;
topo();
for(int i=1;i<=n;i++)if(ans[0]<ans[i])ans[0]=ans[i];//求最大值就过了
printf("%d",ans[0]);
return 0;
}