poj 1094 Sorting It All Out (拓扑排序)

poj 1094 Sorting It All Out (拓扑排序)

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

链接:poj 1094

题意:给定一系列关系(仅仅存在大写字母),推断是否存在矛盾,

或无法确定关系。或能够确定唯一的关系

分析:利用拓扑排序。可是须要边输入关系边排序

矛盾:推断是否存在环

确定关系:能找出唯一的拓扑排序

不能确定关系:不存在环,且全部关系处理后,关系仍无法确定

注:假设出现矛盾,则无需推断接下来的关系了

#include<stdio.h>
#include<string.h>
int n,m,vis[30],rd[30],flag[30],map[30][30],cnt;
char t[30];
int tpsort()
{
    int i,j,k,num,mark=1;
    cnt=0;
    memset(vis,0,sizeof(vis)); //标记是否訪问
    for(i=0;i<n;i++)
        if(flag[i]){
            num=0;
            for(j=0;j<n;j++)    //计算入度为0的个数
                if(flag[j]&&!rd[j]&&!vis[j])
                    num++;     
            if(num==0)  //若不存在入度为0结点,则存在环
                return 0;
            if(num>1)   //若入度为0的结点大于1。说明无法确立唯一的拓扑关系
                mark=0;
            for(j=0;j<n;j++){
                if(flag[j]&&!rd[j]&&!vis[j]){
                    t[cnt++]=j+'A';
                    vis[j]=1;
                    break;
                }
            }
            for(k=0;k<n;k++)
                if(map[j][k])
                    rd[k]--;
        }
    if(!mark)
        cnt=0;
    return 1;
}
int main()
{
    int i,j,mark,pos,r[30];
    char s[5];
    while(scanf("%d%d",&n,&m)!=EOF){
        if(m==0&&n==0)
            break;
        mark=1;
        memset(map,0,sizeof(map));
        memset(flag,0,sizeof(flag)); //标记该元素是否存在
        memset(r,0,sizeof(r));
        for(i=1;i<=m;i++){
            scanf("%s",s);
            if(mark==1){
                flag[s[0]-'A']=flag[s[2]-'A']=1;
                if(s[1]=='>'){
                    map[s[2]-'A'][s[0]-'A']=1;  //记录边的关系
                    r[s[0]-'A']++;              //记录入度
                }
                else{
                    map[s[0]-'A'][s[2]-'A']=1;
                    r[s[2]-'A']++;
                }
                for(j=0;j<n;j++)
                    rd[j]=r[j];   //辅助空间。防止过程中拓扑排序将入度改变了
                mark=tpsort(); 
                if(!mark)   
                    pos=i;
                if(mark&&cnt==n){  //当没有出现环且关系都确定
                    mark=2;
                    pos=i;
                    t[cnt]=0;  //字符数组最后附空字符
                }
            }
        }
        if(mark==0)
            printf("Inconsistency found after %d relations.\n",pos);
        else if(mark==1)
            printf("Sorted sequence cannot be determined.\n");
        else if(mark==2)
            printf("Sorted sequence determined after %d relations: %s.\n",pos,t);
    }
    return 0;
}

版权声明:本文博主原创文章。博客,未经同意不得转载。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116980.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • monthdiff oracle_timestampdiff

    monthdiff oracle_timestampdiff营销树今天精心准备的是《timestampdiff》,下面是详解!mysql两个时间(我有两个字段是datetime类型)相减返…在mysql中,这种计算可用TIMESTAMPDIFF函数来解决,但是解决过程中需要将数据多次加工。1、创建测试表及插入测试数据:createtabletest(time1datetime,time2datetime)insertintotestval…

    2022年4月28日
    143
  • leetcode-155最小栈(历史最值)「建议收藏」

    leetcode-155最小栈(历史最值)「建议收藏」原题链接设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入:[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”][[],[-2],[0],[-3],[],[],[],[]]输出:[null,null,null,nul

    2022年8月8日
    3
  • 软件开发项目管理经验总结

    软件开发项目管理经验总结这是我从事软件外包工作以来的项目管理经验的总结,编写文章的目的是为了回顾和总结自己的一些想法,如果其中有不足的地方大家可以一起讨论交流。项目经理的职责关于项目经理的工作职责有很多种说法,我自己是这样理解的作为一名项目经理第一目标就是合理利用公司资源组织设计、开发、测试等各种资源完成项目的高质量交付,并保证项目的盈利。这是衡量一个项目失败或者成功的唯…

    2022年5月12日
    34
  • pydroid3安装scrapy_安装scrapy框架

    pydroid3安装scrapy_安装scrapy框架修改Anaconda镜像源condaconfig–addchannelshttps://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/condaconfig–setshow_channel_urlsyes此时在C:\Users\Administrator(这里是电脑用户名)下就会生成配置文件.condarcchannels:-https://mirrors.tuna.tsinghua.edu.cn/anaco

    2022年9月17日
    0
  • Sublime text3 Version 3.2.1 3207 和 3.2.2 3211(2019-11-06亲测有效)

    Sublime text3 Version 3.2.1 3207 和 3.2.2 3211(2019-11-06亲测有效)Sublimetext3Version3.2.13207激活码许可证(2019-04-30亲测有效)在hosts中添加: 127.0.0.1license.sublimehq.comhosts地址: C:\Windows\System32\drivers\etc点击下载Sublimetext3打开sublime安装文件地址点击下载激活成功教程工具将激活成功教程工具复制到安装文件…

    2022年7月11日
    14
  • 缺陷报告编写规范[通俗易懂]

    缺陷报告编写规范[通俗易懂]引言 软件缺陷定义  软件缺陷(Defect):又叫做Bug。即为计算机软件、程序、web应用中存在的某种不符合正常运行的功能问题。也是错误、隐藏,让用户不满意的功能缺陷。从产品内部看,缺陷是软件产品开发或维护过程中存在的错误、毛病等各种问题;从产品外部看,缺陷是系统所需要实现的某种功能的失效或违背。 缺陷报告定义  缺陷报告把测试的过程和结果写成文档,并对发现的问题和缺陷进行分析,为…

    2022年9月18日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号