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;
}

目录
相关文章
|
移动开发 前端开发 iOS开发
记录一下前端H5的复制功能在ios端的兼容性问题
记录一下前端H5的复制功能在ios端的兼容性问题
1320 0
|
存储 人工智能 定位技术
战略地图|用户为先、AI驱动,以创业心态创造更大价值
9月10日,阿里巴巴集团董事会主席蔡崇信发布全员信宣布,已在当日按计划完成集团管理职务交接,由他接任集团董事会主席职务,吴泳铭出任集团CEO。这意味着,阿里巴巴完成了公司管理职务的第二次制度化交接棒,今年3月启动的自我变革快速顺利推进。 随着阿里巴巴1+6+N全新业务集群基本成型,阿里巴巴“24年来最重要变革”正给公司带来全新变化。与此同时,阿里巴巴集团CEO吴泳铭还兼任阿里云董事长与CEO,这样的任命也足以看出云计算之于阿里巴巴集团的重要性,阿里云下一步将如何发展?本文根据吴泳铭全员信和内部讲话梳理,进一步呈现变化将如何展开。
566 1
|
消息中间件 分布式计算 算法
大数据-67 Kafka 高级特性 分区 分配策略 Ranger、RoundRobin、Sticky、自定义分区器
大数据-67 Kafka 高级特性 分区 分配策略 Ranger、RoundRobin、Sticky、自定义分区器
199 3
|
分布式计算 大数据 数据处理
MaxCompute操作报错合集之编写UDF(用户自定义函数)时,报错:找不到主类,是什么原因
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
328 1
|
自然语言处理 算法 搜索推荐
Android文字匹配度算法
【5月更文挑战第15天】
285 1
|
机器学习/深度学习 数据可视化
生存分析模型的时间依赖性ROC曲线可视化
生存分析模型的时间依赖性ROC曲线可视化
|
easyexcel
EasyExcel使用与详细说明,EasyExcel工具类(二)
EasyExcel使用与详细说明,EasyExcel工具类
1263 0
|
Linux 网络安全 开发工具
部署PXE远程安装服务
部署PXE远程安装服务
599 0
|
存储 编解码 Android开发
Studio One6汉化中文版本更新下载
Studio One6全新版本上线记录、生产、混合、掌握和执行所有操作。从工作室到舞台,Studio One6以易用为核心,是您的创意合作伙伴。当你准备好登上舞台时,Studio One就在那里。只有Studio One从最初的灵感到完整的制作,最终混音到精选专辑,数字发行到舞台制作,无缝地与你一起移动,让你真正的创造没有界限。
1801 0