P1983 [NOIP2013 普及组] 车站分级


Day 12+13 拓扑


代码如下(示例):

    #include<bits/stdc++.h>
    using namespace std;
    int rd[2000],dis[2000];
    int ans;
    struct node   {
        int y,nxt;
    }edge[1000005];
    bool eve[1005][1005];
    int head[2000],tot=0;
    void add(int x,int y)   {
        tot++;
        edge[tot].y=y;
        edge[tot].nxt=head[x];
        head[x]=tot;
    }
    int a[2000],b[2000],Hash[2000];
    void Init()
    {
        memset(Hash,0,sizeof(Hash));
        int n,m=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]),Hash[a[i]]=1;
        for(int i=a[1];i<=a[n];i++)
            if(Hash[i]==0) b[++m]=i;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            if(!eve[a[i]][b[j]])     {
                eve[a[i]][b[j]]=1;
                add(a[i],b[j]);
                rd[b[j]]=1;     }
        return ; }
    void dfs(int u,int num)
    {
        if(num<=dis[u]) return ;
        dis[u]=num;
        for(int i=head[u];i!=-1;i=edge[i].nxt)
            dfs(edge[i].y,num+1);    }                                                                                                 
    int main()  {
        int n,m;
        cin>>n>>m;
        memset(rd,0,sizeof(rd));
        memset(dis,0,sizeof(dis));
        memset(eve,0,sizeof(eve));
        memset(head,-1,sizeof(head));
        for(int i=1;i<=m;i++)
            Init();
        for(int i=1;i<=n;i++)
            if(!rd[i])    dfs(i,1);
        for(int i=1;i<=n;i++)
            if(dis[i]>ans) ans=dis[i];
        cout<<ans;
        return 0;}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值