ZZUOJ 1199 大小关系(拓扑排序,两种方法_判断入度和dfs回路判断)

/*
  这道题如果按照度为0的节点来判断的时候,将度为0的节点和其相连的节点(度数并减去1)
  从图中去掉,如果度为0的节点的个数为0个但是图中的节点没有都去掉的   时候那么说明
  出现了回路!用这种方法必须将重边去除掉! 

  所以推荐用dfs方式进行判断!这种方式还是比较直观的!
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;

int used[30];
int deg[30];
int map[30][30];
int sum;
bool topoSort(){
    for(int i=1; i<=sum; ++i){
        int cnt=0, p;
        for(int j=0; j<26; ++j)
           if(used[j] && deg[j]==0) {
              ++cnt;
              p=j;
           }
        if(cnt==0) return false;
        for(int j=0; j<26; ++j)
           if(map[p][j]){
               map[p][j]=0;
               --deg[j];
           }
        deg[p]=-1;
    }
    return true;
}

int main(){
    int m;
    char ch[5];
    while(cin>>m){
        memset(used, 0, sizeof(used));
        memset(deg, 0, sizeof(deg));
        memset(map, 0, sizeof(map));
        while(m--){
           cin>>ch;
           used[ch[0]-'A'] =1;
           used[ch[2]-'A'] =1;
           if(ch[1]=='>'){
               if (map[ch[2]-'A'][ch[0]-'A'] != 1) {//去掉多重边
               ++deg[ch[0]-'A'];
               map[ch[2]-'A'][ch[0]-'A']=1;
               }
           }
           else{
               if (map[ch[0]-'A'][ch[2]-'A'] != 1) {
               ++deg[ch[2]-'A'];
               map[ch[0]-'A'][ch[2]-'A']=1;
            }
          }
        }
        sum=0;
        for(int i=0; i<26; ++i)
           if(used[i])  ++sum;
        if(topoSort())
           cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
} 

*/

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int map[30][30];
int vis[30]; 

bool dfs(int cur){
    vis[cur]=-1;
    for(int i=0; i<26; ++i)
       if(map[cur][i]){
          if(vis[i]==-1) return false;
          if(!vis[i] && !dfs(i)) return false;
       }
    vis[cur]=1;
    return true;
}

int main(){
    int m;
    char ch[5];
    while(cin>>m){
        memset(vis, 0, sizeof(vis));
        memset(map, 0, sizeof(map));
        while(m--){
            cin>>ch;
            if(ch[1]=='>')
               map[ch[2]-'A'][ch[0]-'A']=1;
            else
               map[ch[0]-'A'][ch[2]-'A']=1;
        }
        int flag=0;
        for(int i=0; i<26; ++i)
           if(!vis[i])
             if(!dfs(i)){
                flag=1;
                break;
             }
        if(flag)  cout<<"NO"<<endl;
        else cout<<"YES"<<endl;
    }
    return 0;
}
时间: 2024-08-28 11:27:32

ZZUOJ 1199 大小关系(拓扑排序,两种方法_判断入度和dfs回路判断)的相关文章

用Java集合中的Collections.sort方法如何对list排序(两种方法)_java

第一种是list中的对象实现Comparable接口,如下: /** * 根据order对User排序 */ public class User implements Comparable <user> { private String name; private Integer order; public String getName() { return name; } public void setName(String name) { this.name = name; } publi

压缩aspx页面删除多余空格的两种方法_实用技巧

两种方法实现: 1)一行一行的读取aspx文件然后处理 2)一次性读取aspx文件然后处理  处理逻辑: 替换"  "为" "(将两个空格替换为一个空格),将所有的换行符替换为空字符(极限压缩) 注意事项: 1)一行一行处理在极限压缩的情况下需要额外的处理服务端控件换行的情况,比如 复制代码 代码如下: Line 1:<asp:Label  runat="server" Line 2: ID="lb1"   .... L

asp.net清空Cookie的两种方法_实用技巧

asp.net清空Cookie的两种方法 第一种 Cookie.Expires=[DateTime]; Response.Cookies("UserName").Expires = 0; 第二种 Response.Cookies["admin"].Expires = DateTime.Now.AddDays(-1); 

ASP.Net中利用CSS实现多界面的两种方法_实用技巧

本文实例讲述了ASP.Net中利用CSS实现多界面的两种方法.分享给大家供大家参考.具体实现方法如下: 可以通过使页面动态加载不同CSS来实现多界面的效果: 方法一: 复制代码 代码如下: <%@page language="C#"%> <%@import namespace="System.Data"%> <script language="c#" runat="server"> publ

asp.net实现图片以二进制流输出的两种方法_实用技巧

本文实例讲述了asp.net实现图片以二进制流输出的两种方法.分享给大家供大家参考,具体如下: 方法一: System.IO.MemoryStream ms = new System.IO.MemoryStream(); System.IO.Stream str = new FileUpload().PostedFile.InputStream; System.Drawing.Bitmap map = new System.Drawing.Bitmap(str); map.Save(ms, Sy

C# web api返回类型设置为json的两种方法_实用技巧

web api写api接口时默认返回的是把你的对象序列化后以XML形式返回,那么怎样才能让其返回为json呢,下面就介绍两种方法: 方法一:(改配置法) 找到Global.asax文件,在Application_Start()方法中添加一句: 复制代码 代码如下: GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); 修改后: 复制代码 代码如下: protected void

JavaScript正则表达式验证身份证号码是否合法(两种方法)_正则表达式

第一种方法: 在用户注册页面有些需求要求的比较严格,需要对身份证js验证是否合法,通过此功能严格此系统软件,从而过滤到很多水客.下面就此实现方法给大家讲解下. 很多时候我们都是通过一组正则表达式来判断用户输入的身份证是否合法,那在用正则表达式判断之前,你对身份证号的组成有多少了解呢?下面来说说一个身份证号里面包含了多少的信息: 1.号码的结构 公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码.

C#实现HTTP协议迷你服务器(两种方法)_实用技巧

本文以两种稍微有差别的方式用C#语言实现HTTP协议的服务器类,之所以写这些,也是为了自己能更深刻了解HTTP底层运作. 要完成高性能的Web服务功能,通常都是需要写入到服务,如IIS,Apache Tomcat,但是众所周知的Web服务器配置的复杂性,如果我们只是需要一些简单的功能,安装这些组件看起来就没多大必要.我们需要的是一个简单的HTTP类,可以很容易地嵌入到简单的Web请求的服务,加到自己的程序里. 实现方法一: .net框架下有一个简单但很强大的类HttpListener.这个类几行

彻底解决&amp;quot;停用连接出错&amp;quot;问题的两种方法_应用技巧

新配的电脑,集成的网卡出现问题,应该是驱动没装好的缘故无法禁用网卡,禁用会提示如下错误 复制代码 代码如下: 停用连接出错   ---------------------------   此时无法停用连接.这个连接可能在用一个或多个不支持即插即用的协议,或者它是由其他用户或系统帐户初始化的.   ---------------------------   确定   ---------------------------     第一种方法:"停用连接"时提示:此时无法停用连接.这个连接