zoukankan      html  css  js  c++  java
  • Luogu P1983 车站分级

      (一周没写过随笔了)

      这道题有

      看到题目,发现这么明显(??)的要求顺序,还有什么想法,拓扑!

      将每条路范围内等级大于等于它的点(不能重复(坑点1))和它连一条边,注意起点终点都要有(坑点2),然后拓扑求解即可。

      BFS的拓扑感觉更好。

      然后打了个map判重交上去帅气的TLE了3个点

      

    #include<cstdio>
    #include<vector>
    #include<cstring>
    #include<iostream>
    #include<map>
    using namespace std;
    const int N=1005;
    vector <int> a[N];
    map <int,bool> ma[N];
    int n,i,m,j,q[N*2+10],head,tail,s[N],x,k,ru[N],bs[N],ans;
    bool f[N];
    inline void read(int &x)
    {
        x=0; char ch=getchar();
        while (ch<'0'||ch>'9') ch=getchar();
        while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    }
    int main()
    {
        read(n); read(m);
        for (i=1;i<=m;++i)
        {
            memset(f,0,sizeof(f));
            read(s[0]);
            for (j=1;j<=s[0];++j)
            read(s[j]),f[s[j]]=1;
            for (j=s[1]+1;j<=s[s[0]];++j)
            if (!f[j]) 
            for (k=1;k<=s[0];++k)
            if (!ma[s[k]][j]) a[s[k]].push_back(j),ru[j]++,ma[s[k]][j]=1;
        }
        for (i=1;i<=n;++i)
        if (!ru[i]) q[++tail]=i,bs[i]=1;
        while (head<tail)
        {
            int now=q[++head];
            for (i=0;i<a[now].size();++i)
            {
                int k=a[now][i];
                bs[k]=bs[now]+1;
                ans=max(ans,bs[k]);
                if (!(--ru[k])) q[++tail]=k;        
            }
        }
        printf("%d",ans);
        return 0;
    }

      然后一想,N<=1000至于用map么。然后直接二维数组判断,然后过了。。。

    #include<cstdio>
    #include<vector>
    #include<cstring>
    #include<iostream>
    using namespace std;
    const int N=1005;
    vector <int> a[N];
    int n,i,m,j,q[N*2+10],head,tail,s[N],x,k,ru[N],bs[N],ans;
    bool f[N],p[N][N];
    inline void read(int &x)
    {
        x=0; char ch=getchar();
        while (ch<'0'||ch>'9') ch=getchar();
        while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    }
    int main()
    {
        read(n); read(m);
        for (i=1;i<=m;++i)
        {
            memset(f,0,sizeof(f));
            read(s[0]);
            for (j=1;j<=s[0];++j)
            read(s[j]),f[s[j]]=1;
            for (j=s[1];j<=s[s[0]];++j)
            if (!f[j]) 
            for (k=1;k<=s[0];++k)
            if (!p[s[k]][j]) a[s[k]].push_back(j),ru[j]++,p[s[k]][j]=1;
        }
        for (i=1;i<=n;++i)
        if (!ru[i]) q[++tail]=i,bs[i]=1;
        while (head<tail)
        {
            int now=q[++head];
            for (i=0;i<a[now].size();++i)
            {
                int k=a[now][i];
                bs[k]=bs[now]+1;
                ans=max(ans,bs[k]);
                if (!(--ru[k])) q[++tail]=k;        
            }
        }
        printf("%d",ans);
        return 0;
    }

      一道坑题!

  • 相关阅读:
    java设计模式----工厂设计模式
    java拓展----CountDownLatch同步辅助类
    java设计模式----单例模式
    java拓展----Lock锁
    Orcal学习----初识Orcal
    java学习----泛型
    java学习----Junit&Log4j
    java学习----注解
    java学习----反射
    java学习----数据解析
  • 原文地址:https://www.cnblogs.com/cjjsb/p/8039529.html
Copyright © 2011-2022 走看看