车站分级

来源:互联网 发布:js获取标签name值 编辑:程序博客网 时间:2024/04/26 08:59

QAQ
这真是一个大水题,,,,
首先,我们知道没访问的车站一定比访问的车站编号小
所以,将起点到终点中访问的车站向没访问的车站建边,进行拓扑排序,看有几层,即为答案!

#include <cstdio>#include <iostream>#include <algorithm>#include <queue>#include <cstring>using namespace std;bool map[1001][1001];bool vis[1001];int sta[1001];int r[1001];queue <int> dl; int work(int n){    memset(vis,0,sizeof(vis));    int ans=0;    while(1)    {        for(int i=1;i<=n;i++)         if(r[i]==0&&vis[i]==0)         {            dl.push(i);            vis[i]=1;         }        if(dl.empty()) break;        while(!dl.empty())        {            for(int i=1;i<=n;i++)             if(map[dl.front()][i])              map[dl.front()][i]=0,r[i]--;            dl.pop();        }        ans++;    }    return ans;}int main(){    int n,m;    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++)     {        memset(vis,0,sizeof(vis));          int t;        scanf("%d",&t);        for(int j=1,a;j<=t;j++)         scanf("%d",&a),vis[a]=1,sta[j]=a;        for(int j=sta[1];j<=sta[t];j++)        if(!vis[j])         {            for(int k=1;k<=t;k++)             if(map[sta[k]][j]==0) map[sta[k]][j]=1,r[j]++;            }     }    printf("%d",work(n));    return 0;}