zoukankan      html  css  js  c++  java
  • codevs2833 奇怪的梦境 x

    2833 奇怪的梦境

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
     
    题目描述 Description

    Aiden陷入了一个奇怪的梦境:他被困在一个小房子中,墙上有很多按钮,还有一个屏幕,上面显示了一些信息。屏幕上说,要将所有按钮都按下才能出去,而又给出了一些信息,说明了某个按钮只能在另一个按钮按下之后才能按下,而没有被提及的按钮则可以在任何时候按下。可是Aiden发现屏幕上所给信息似乎有矛盾,请你来帮忙判断。

    输入描述 Input Description

    第一行,两个数N,M,表示有编号为1...N这N个按钮,屏幕上有M条信息。

    接下来的M行,每行两个数ai,bi,表示bi按钮要在ai之后按下。所给信息可能有重复,保证ai≠bi。

    输出描述 Output Description

    若按钮能全部按下,则输出“o(∩_∩)o”。

    若不能,第一行输出“T_T”,第二行输出因信息有矛盾而无法确认按下顺序的按钮的个数。输出不包括引号。

    样例输入 Sample Input

    3 3

    1 2

    2 3

    3 2

    样例输出 Sample Output

    T_T

    2

    数据范围及提示 Data Size & Hint

    对于30%的数据,保证0<N≤100。

    对于50%的数据,保证0<N≤2000。

    对于70%的数据,保证0<N≤5000。

    对于100%的数据,保证0<N≤10000,0<M≤2.5N。

    思路:

      拓扑排序,两种写法

    代码一:

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <queue>
    
    using namespace std;
    
    const int M = 10005;
    int n,m,ans,now;
    int ru[M],head[M];
    queue<int>q;
    
    struct A{
        int next,to;
    }e[4*M];
    
    void add(int u,int v)
    {
        e[++now].to=v;
        e[now].next=head[u];
        head[u]=now;
    }
    
    void topo()
    {
        for(int i=1;i<=n;i++)
            if(ru[i]==0)
                q.push(i);
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            ans++;
            for(int i=head[u];i!=-1;i=e[i].next)
            {
                int v=e[i].to;
                ru[v]--;
                if(ru[v]==0)
                    q.push(v);
            }
        }
        if(ans<n)
        {
            printf("T_T
    %d",n-ans);
            return;
        }
        else
        {
            printf("o(n_n)o");
            return;
        }
    }
    
    int main()
    {
        scanf("%d%d",&n,&m);
        memset(head,-1,sizeof(head));  
        for(int i=1,a,b;i<=m;i++)
        {
            scanf("%d%d",&a,&b);
            add(a,b);
            ru[b]++;
        }
        topo();
        return 0;
    }
    队列版

    代码二:

    #include <iostream>
    #include <cstdio>
    #include <queue>
    
    using namespace std;
    
    const int M = 10005;
    int n,m,k,ans;
    bool dad[M][M];
    int ru[M];
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1,a,b;i<=m;i++)
        {
            ///b在a之前按下 
            scanf("%d%d",&a,&b);
            if(!dad[a][b]) ru[b]++; 
            dad[a][b]=true;
        }
        for(int i=1;i<=n;i++)
        {
            k=1;///记得将k进行初始化,防止漏下找入度为零的点 
            while(k<=n && ru[k]!=0) k++;///找入度为零的点 
            if(k<=n && ru[k]==0)
            {
                ans++;///统计答案个数 
                ru[k]=-1;///删边 
                for(int j=1;j<=n;j++)
                    if(dad[k][j])
                        ru[j]--;///删边 
            }
        }
        if(ans==n) printf("o(n_n)o");
        else printf("T_T
    %d
    ",n-ans);
        return 0;
    }
    for循环版

     Ps:如果让我进行选择,我会毫不犹豫的选择第一种,因为跑得快而且内存占用小!!!

    如果运气好也是错,那我倒愿意错上加错!

    ❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀

  • 相关阅读:
    利用wsdl.exe自动将wsdl文档转换为C#代码
    VS2008中C#开发webservice简单实例
    VS2012环境下C#调用C++生成的DLL
    VS2012 C#生成DLL并调用
    .NET在VS2008中生成DLL并调用
    面试题----寻找比一个N位数大的“下”一个数
    VS2008生成DLL并使用
    VS2008 生成静态链接库并使用
    一天一道练习题--2014年3月8日19:35:07
    C/C++中extern关键字详解
  • 原文地址:https://www.cnblogs.com/zxqxwnngztxx/p/7103340.html
Copyright © 2011-2022 走看看