1 条题解

  • 0
    @ 2026-6-14 9:42:18

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=2010;
    vector<pair<int,int>> e[N];
    int n,m,a[N],vis[N];
    int rd[N],d[N],ans=1;
    
    void topo(){
      for(int i=1; i<=n; i++) d[i]=1; //最低级别为1
      queue<int> q;
      for(int i=1; i<=n+m; i++) if(!rd[i]) q.push(i);
      while(!q.empty()){
        int u=q.front(); q.pop();
        for(auto [v,w]:e[u]){
          d[v]=max(d[v],d[u]+w); //更新最长路
          ans=max(ans,d[v]);
          if(--rd[v]==0) q.push(v);
        }
      }
    }
    int main(){
      cin>>n>>m; //n个站点 m趟车次
      for(int i=1,s; i<=m; i++){
        memset(vis,0,sizeof vis);
        cin>>s; //停站个数
        for(int j=1; j<=s; j++){
          cin>>a[j];
          vis[a[j]]=1; //停站标记
        }
        int v=n+i; //建中间虚点
        for(int j=a[1]; j<=a[s]; j++){
          if(!vis[j]) e[j].emplace_back(v,0), rd[v]++; //不停站向虚点连边
          else e[v].emplace_back(j,1), rd[j]++; //虚点向停站连边
        }
      }
      topo();
      cout<<ans;
    }
    
    
    • 1

    D151 拓扑排序[NOIP 2013 普及组] 车站分级

    信息

    ID
    674
    时间
    1000ms
    内存
    128MiB
    难度
    9
    标签
    递交数
    12
    已通过
    4
    上传者