zoukankan      html  css  js  c++  java
  • (简单) HDU 5154 Harry and Magical Computer,图论。

    Description
      In reward of being yearly outstanding magic student, Harry gets a magical computer. When the computer begins to deal with a process, it will work until the ending of the processes. One day the computer got n processes to deal with. We number the processes from 1 to n. However there are some dependencies between some processes. When there exists a dependencies (a, b), it means process b must be finished before process a. By knowing all the m dependencies, Harry wants to know if the computer can finish all the n processes.
     
      题目大致就是说对一个有向图判断是否有环。BC 25 的A题,这场比赛很幸运的爆零了,我觉得是因为A题不停的写错导致整个人都乱了,看来以后要注意,如果第一个题就乱了的话要注意调整,不能影响之后的发挥。
      这个题目的题解是用的floyd写的,我使用dfs写的,貌似复杂度低一点。
     
    代码如下:
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    
    using namespace std;
    
    bool vis[105];
    bool rem[105];
    int n,m;
    int first[105];
    int next[10005];
    int bs[10005],be[10005];
    
    bool dfs(int x)
    {
        int t=first[x];
        
        while(t)
        {
            if(rem[be[t]])                //这里要注意先判断。
                return 0;
    
            if(vis[be[t]]==0)
            {
                vis[be[t]]=1;
                rem[be[t]]=1;
                
                if(dfs(be[t])==0)
                    return 0;
                rem[be[t]]=0;
            }
    
            t=next[t];                //不然会无限循环。
        }    
    
        return 1;
    }
    
    bool getans()
    {
        for(int i=1;i<=n;++i)
            if(vis[i]==0)
            {
                memset(rem,0,sizeof(rem));        //这里要注意清零。
                rem[i]=1;
                vis[i]=1;
                if(dfs(i)==0)
                    return 0;
            }
    
        return 1;
    }
    
    int main()
    {
        int a,b;
        int temp;
    
        while(~scanf("%d %d",&n,&m))
        {
            memset(vis,0,sizeof(vis));
            memset(first,0,sizeof(first));
            memset(next,0,sizeof(next));
            
            for(int i=1;i<=m;++i)
            {
                scanf("%d %d",&a,&b);
                bs[i]=b;
                be[i]=a;
                temp=first[b];
                first[b]=i;
                next[i]=temp;
            }
    
            if(getans())
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    Sharepoint COMException 0x81020037
    [SharePoint]如何去掉欢迎导航的信息?
    配置两台Azure服务器,一台加入另一台的ad域加入不进去的问题
    在Azure上部署Sqlserver网络访问不了的问题
    Page 由于代码已经过优化或者本机框架位于调用堆栈之上
    ProjectOnline同步数据到线下
    关于ProjectServer定制化项目中心页面
    oracle数据库逐步学习总结【基础二】
    Java学习个人总结
    oracle数据库逐步学习总结【基础一】
  • 原文地址:https://www.cnblogs.com/whywhy/p/4203082.html
Copyright © 2011-2022 走看看