• 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(".
    ");
                } else if(temp==2) {
                    printf("Inconsistency found after %d relations.
    ",p);
                }
            } else    printf("Sorted sequence cannot be determined.
    ");
        }
        return 0;
    }
    
  • 相关阅读:
    hdu 5025 bfs+状压
    hibernate的saveOrUpdate方法
    jsp中使用css选择器与<c:foreach>标签的问题
    5- js 正则的方法
    cookie存储的值
    word中目录的灰色是怎么回事?
    css三角形
    windows下,OracleServiceXXX和Oracle 实例的关系
    echo的功能
    myeclipse 删除不再使用的工作空间记录
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/7294023.html
Copyright © 2020-2023  润新知