poj1094Sorting It All Out

本文介绍了一种基于拓扑排序算法的实现方法,并通过一个具体的C语言程序示例展示了如何利用拓扑排序来解决实际问题。具体而言,程序通过读取一系列字符关系,判断这些字符之间的先后顺序是否能构成一个确定的序列。

http://poj.org/problem?id=1094

<span style="font-size:18px;">#include<stdio.h>
#include<string.h>
int map[27][27],indegree[27],q[27];//q[]存储序列值
int TopoSort(int n) //拓扑排序 
{
    int c=0,temp[27],loc,m,flag=1,i,j;//flag=1:有序 flag=-1:不确定
    for(i=1;i<=n;i++)
        temp[i]=indegree[i];
    for(i=1;i<=n;i++)//n次
    {
        m=0;
        for(j=1;j<=n;j++)
            if(temp[j]==0)//查找入度为零的顶点个数
            { 
                m++; 
                loc=j; 
            }
        if(m==0)//有环
            return 0;  
        if(m>1)//当前无序 这里只能标记不能返回 因为有可能在后面查询中会成环 若成环直接输出答案 
            flag=-1;   
        q[c++]=loc;//并入数组   
        temp[loc]=-1;//不再查询该点
        for(j=1;j<=n;j++)//更新操作 与并入点有关系的点入度全部减一
            if(map[loc][j]==1) 
                temp[j]--;
    }
    return flag;
}
 
int main()
{
    int m,n,i,j,x,y,s,sign;  //当sign=1时,已得出结果
    char str[5];
    while(scanf("%d%d",&n,&m))
    {
        if(m==0&&n==0) 
			break;
        memset(map,0,sizeof(map));
        memset(indegree,0,sizeof(indegree));
        sign=0;
        for(i=1;i<=m;i++)
        {
            scanf("%s",str);
            if(sign) continue; //一旦得出结果,对后续的输入不做处理
            x=str[0]-'A'+1;
            y=str[2]-'A'+1;
            map[x][y]=1;
            indegree[y]++;
            s=TopoSort(n);
            if(s==0) //有环
            {
                printf("Inconsistency found after %d relations.\n",i);
                sign=1;
            }
            if(s==1) //有序
            {
                printf("Sorted sequence determined after %d relations: ",i);
                for(j=0;j<n;j++)
                    printf("%c",q[j]+'A'-1);
                printf(".\n");
                sign=1;
            }
        }
        if(!sign) //不确定
            printf("Sorted sequence cannot be determined.\n");
    }
    return 0;
}
</span>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值