洛谷---车站分级

洛谷---车站分级_第1张图片
洛谷---车站分级_第2张图片
题解:
理解题意后就是一个拓扑排序,总共将入度不为0的所有点删几次可以删完
AC代码:

#include
using namespace std;
#define maxn 1005
int n,m,ans;
int st[maxn],s,topo[maxn][maxn],de[maxn],tt[maxn],top;
bool is[maxn],bo[maxn];
void input()
{
    scanf("%d %d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        memset(is,0,sizeof(is));
        scanf("%d",&s);
        for(int j=1;j<=s;j++)
        {
            scanf("%d",&st[j]);
            is[st[j]]=true;
        }
        for(int j=st[1];j<=st[s];j++)//起点和终点
        {
            if(!is[j])//如果不是已经停靠的点,就枚举已经停靠的点
            {
                for(int k=1;k<=s;k++)
                {
                    if(!topo[j][st[k]])//枚举已经停靠的点
                    {
                        topo[j][st[k]]=1;//topo[i][j]表示j>i的等级
                        de[st[k]]++;//度++
                    }
                }
            }
        }
    }

}
void toposort()
{
    do
    {
        top=0;
        for(int i=1;i<=n;i++)
        {
            if(de[i]==0&&!bo[i])
            {
                tt[++top]=i;//表示入度为0的点
                bo[i]=true;//开始将入度为0的点删除
            }
        }
        for(int i=1;i<=top;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(topo[tt[i]][j])
                    topo[tt[i]][j]=0,de[j]--;
            }
        }
        ans++;
    }while(top);
    printf("%d",ans-1);

}
int main()
{
    ans=0;
    input();
    toposort();

}

你可能感兴趣的:(洛谷---车站分级)