码迷,mamicode.com
首页 > 编程语言 > 详细

poj1094Sorting It All Out——拓扑排序

时间:2018-04-02 23:48:42      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:关系   stream   代码   最小   iostream   namespace   ace   出现   http   

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

看到此题,首先觉得这是一种层层递进的关系,所以可以想到用拓扑排序;

就像人工排序,每次需要找到一个最小的,再找到新的最小的……所以用有向边代表小的元素到大的元素的关系,每次的入度为0的点就是最小的;

出现错误也就是出现了环,可以看做是拓扑排序过程后还有没有被排到的点,也就是怎样入度都不为0;

因为要输出哪一步,所以就一步一步,每一步上建图、判断等等;

注意因为上一步不能影响下一步,所以排序中不能把真的入度减去。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;
int n,m,reg[30],ans[30],num,tmp[30];
bool sid[30][30],f0,f1;
char dc[5];
int per()
{
    memset(ans,0,sizeof ans);
    while(q.size())q.pop();
    for(int i=1;i<=n;i++)
        if(!reg[i])q.push(i);//
    memcpy(tmp,reg,sizeof reg);//!!!注意别影响全局 
    num=0;
    bool flag=0;
    while(q.size())
    {
        if(q.size()>1)flag=1;//有超过一个入度为0的点 
        int x=q.top();q.pop();
        ans[++num]=x;
        for(int i=1;i<=n;i++)
            if(sid[x][i])
            {
                tmp[i]--;
                if(!tmp[i])q.push(i);
            }
    }
    if(num<n)return 0;//即使不完全也应该有n个,否则有环 
    if(flag)return -1;//可能还没完全 
    return 1;
}
int main()
{
    while(scanf("%d%d",&n,&m)==2)
    {
        if(!n&&!m)return 0;
        memset(sid,0,sizeof sid);
        memset(reg,0,sizeof reg);
        f0=0;f1=0;
        for(int i=1;i<=m;i++)
        {
            cin>>dc;
            if(f0||f1)continue;
            if(sid[dc[2]-A+1][dc[0]-A+1])
            {
                f0=1;
                printf("Inconsistency found after %d relations.\n",i);
                continue;
            }
            if(!sid[dc[0]-A+1][dc[2]-A+1])//!!!
            {
                sid[dc[0]-A+1][dc[2]-A+1]=1;
                reg[dc[2]-A+1]++;
            }
            int k=per();
            if(!k)
            {
                f0=1;
                printf("Inconsistency found after %d relations.\n",i);
            }
            if(k==1)
            {
                f1=1;
                printf("Sorted sequence determined after %d relations: ",i);
                for(int i=1;i<=n;i++)
                    printf("%c",char(ans[i]+A-1));
                
                printf(".\n");
            }
        }
        if(!f0&&!f1)
            printf("Sorted sequence cannot be determined.\n");
    }
}

 

poj1094Sorting It All Out——拓扑排序

标签:关系   stream   代码   最小   iostream   namespace   ace   出现   http   

原文地址:https://www.cnblogs.com/Zinn/p/8698567.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!