P1983 车站分级
题意: 如果标号为x的站点有车停靠,那么出发点到终点站的所有大于等于x的等级的站点都需要停靠,问最少需要多少个等级的站点
做法: 如果某个点没有车停靠,说明这个点的等级小于其他所有有车停靠的站点等级,于是连边,最后跑一边拓扑,求最大深度
一开始理解错题意了,误以为是从该点到终点站而不是出发点到终点站,于是wa到自闭,连了一万次边…
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<queue>
#include<map>
#define ll long long
#define pb push_back
#define rep(x,a,b) for (int x=a;x<=b;x++)
#define repp(x,a,b) for (int x=a;x<b;x++)
#define W(x) printf("%d\n",x)
#define WW(x) printf("%lld\n",x)
#define pi 3.14159265358979323846
#define mem(a,x) memset(a,x,sizeof a)
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
using namespace std;
const int maxn=1e3+7;
const int INF=1e9;
const ll INFF=1e18;
int n,m,t,x[maxn],d[maxn],ans=1,ok[maxn],mapp[maxn][maxn];
vector<int> E[maxn];
typedef pair<int,int> P;
queue<P> q;
int main()
{
mem(mapp,false);
scanf("%d%d",&n,&m);
rep(i,1,m)
{
scanf("%d",&t);
mem(ok,true);
rep(j,1,t)
{
scanf("%d",&x[j]);ok[x[j]]=false;
}
rep(k,x[1]+1,x[t]-1)
{
if (!ok[k])continue;
rep(l,1,t)
{
if (!mapp[k][x[l]])
{
E[k].pb(x[l]);
d[x[l]]++;
mapp[k][x[l]]=true;
}
}
}
}
rep(i,1,n)if (d[i]==0)q.push(make_pair(i,1));
while(!q.empty())
{
P u=q.front();q.pop();
int y=u.first;
int val=u.second;
for (int i=0;i<E[y].size();i++)
{
int z=E[y][i];
d[z]--;
if (d[z]==0)
{
q.push(make_pair(z,val+1));
ans=max(ans,val+1);
}
}
}
W(ans);
return 0;
}