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

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

时间:2015-08-14 19:22:22      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:poj   拓扑排序   

题目地址: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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:poj   拓扑排序   

原文地址:http://blog.csdn.net/u013486414/article/details/47663563

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