首页 > 代码库 > POJ 1094-Sorting It All Out(拓扑排序)

POJ 1094-Sorting It All Out(拓扑排序)

题目地址:POJ 1094
题意:题目例子的三种输出各自是:1. 在第x个关系中能够唯一的确定排序,并输出。2. 在第x个关系中发现了有回环(Inconsisitency矛盾)3.所有关系都没有发现上面两种情况,输出第3种.
思路:注意两点1. 输入一条边时假设此时拓扑有解就输出这个解。即使后面的边成有向环也无论了。所以每次输入的时候都得进行拓扑排序。2. 推断存在有向环应先于推断多解。

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef __int64  LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-7;
const int Maxn=20010;
struct node {
    int u,v,next;
} edge[Maxn];
int head[30];
int in[30],ans[30],IN[30];
int n,m,cnt,sum;
void add(int u,int v)
{
    IN[v]++;
    edge[cnt].u=u;
    edge[cnt].v=v;
    edge[cnt].next=head[u];
    head[u]=cnt++;
}
int topo()
{
    int i;
    queue<int >q;
    for(i=0; i<n; i++) {
        in[i]=IN[i];
    }
    for(i=0; i<n; i++) {
        if(!in[i])
            q.push(i);
    }
    sum=0;
    int flag=0;
    if(q.size()>1)
        flag=1;
    while(!q.empty()) {
        int u=q.front();
        q.pop();
        ans[sum++]=u;
        for(i=head[u]; i!=-1; i=edge[i].next) {
            int v=edge[i].v;
            in[v]--;
            if(in[v]==0)
                q.push(v);
        }
        if(q.size()>1)
            flag=1;
    }
    if(sum!=n)
        return 2;
    else if(flag)
        return 1;
    return 3;
}
int main()
{
    int i,j;
    char str[5];
    while(~scanf("%d %d",&n,&m)) {
        if(!n&&!m) break;
        memset(IN,0,sizeof(IN));
        memset(in,0,sizeof(in));
        memset(head,-1,sizeof(head));
        int flag = 0;
        cnt = 0;
        int temp;
        int p;
        for(i=0; i<m; i++) {
            scanf("%s",str);
            if(flag)    continue;
            add(str[0]-‘A‘,str[2]-‘A‘);
            temp = topo();
            if(temp==2||temp==3) {
                flag = 1;
                p = i + 1;
            }
        }
        if(flag) {
            if(temp==3) {
                printf("Sorted sequence determined after %d relations: ",p);
                for(i=0; i<n; i++) {
                    printf("%c",ans[i]+‘A‘);
                }
                printf(".\n");
            } else if(temp==2) {
                printf("Inconsistency found after %d relations.\n",p);
            }
        } else    printf("Sorted sequence cannot be determined.\n");
    }
    return 0;
}
<script type="text/javascript"> $(function () { $(‘pre.prettyprint code‘).each(function () { var lines = $(this).text().split(‘\n‘).length; var $numbering = $(‘
    ‘).addClass(‘pre-numbering‘).hide(); $(this).addClass(‘has-numbering‘).parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($(‘
  • ‘).text(i)); }; $numbering.fadeIn(1700); }); }); </script>

POJ 1094-Sorting It All Out(拓扑排序)