zoukankan      html  css  js  c++  java
  • POJ 1094 Sorting It All Out (拓扑排序)

    题意:给你一些大写字母间的偏序关系,然后让你判断能否唯一确定它们之间的关系,或者所给关系是矛盾的,或者到最后也不能确定它们之间的关系。   由DAG图节点的偏序关系确定节点的排序可以由拓扑排序求出。而确定这些问题也可以由拓扑排序完成。 我们知道拓扑排序的过程是: 1.每次从队列中找出1个入度为0的点作为当前排序的点(加入到已排序的集合中) 2.从图中删除以这个点为起点的弧(即使所有的终点入度减1) 3.如果找不到入度为0的点则退出过程   那么我们来看拓扑排序的过程中怎么判断这几个问题: 1.如果某次找入度为0的点时有多个入度为0的点,则无法确定关系; 2.如果找不到入度为0的点退出过程,但是并不是所有的点都已经确定排序,则图中一定有环,即关系是矛盾的。   题目还隐形地要求判断矛盾在无法确定关系之前,所以我笨拙地用了两次拓扑排序,第一次确定是否矛盾,第二次再判断能否确定关系。  
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #define MID(x,y) ((x+y)>>1)
    #define mem(a,b) memset(a,b,sizeof(a))
    using namespace std;
    
    const int MAXE = 2000;
    const int MAXV = 30;
    struct node{
        int u, v;
        int next;
    }arc[MAXE];
    int cnt, head[MAXV], ind[MAXV];
    void init(){
        cnt = 0;
        mem(head, -1);
        mem(ind, 0);
        return ;
    }
    void add(int u, int v){
        arc[cnt].u = u;
        arc[cnt].v = v;
        arc[cnt].next = head[u];
        head[u] = cnt ++;
        return ;
    }
    bool vis[MAXV];
    vector  tsort;
    vector  tmp;
    queue  Q;
    void topsort1(int n){
        tmp.clear();
        while(!Q.empty()){
            Q.pop();
        }
        mem(ind, 0);
        mem(vis, 0);
        for(int i = 0; i < cnt; i ++){
            ind[arc[i].v] ++;
        }
        int num = 0;
        for (int i = 0; i < n; i ++){
            if (ind[i] == 0){
                num ++;
                Q.push(i);
                vis[i] = 1;
            }
        }
        while(!Q.empty()){
            int u = Q.front();
            Q.pop();
            tmp.push_back(u);
            for (int i = head[u]; i != -1; i = arc[i].next){
                int v = arc[i].v;
                if (!vis[v]){
                    ind[v] --;
                    if (ind[v] == 0){
                        Q.push(v);
                        vis[v] = 1;
                    }
                }
            }
        }
        return ;
    }
    bool topsort(int n){
        tsort.clear();
        while(!Q.empty()){
            Q.pop();
        }
        mem(ind, 0);
        mem(vis, 0);
        for(int i = 0; i < cnt; i ++){
            ind[arc[i].v] ++;
        }
        int num = 0;
        for (int i = 0; i < n; i ++){
            if (ind[i] == 0){
                if (num > 0){
                    return false;
                }
                else{
                    num ++;
                    Q.push(i);
                    vis[i] = 1;
                }
            }
        }
        while(!Q.empty()){
            if (Q.size() > 1)
                return false;
            int u = Q.front();
            Q.pop();
            tsort.push_back(u);
            for (int i = head[u]; i != -1; i = arc[i].next){
                int v = arc[i].v;
                if (!vis[v]){
                    ind[v] --;
                    if (ind[v] == 0){
                        Q.push(v);
                        vis[v] = 1;
                    }
                }
            }
        }
        return true;
    }
    int n, m;
    int main(){
        //freopen("B.1.dat","r+",stdin);
        //freopen("B.1.out","w+",stdout);
        while(scanf("%d %d", &n, &m)){
            if (n + m == 0)
                break;
            init();
            int ok = 0;
            int i;
            char s[4];
            for (i = 1; i <= m; i ++){
                scanf("%s", s);
                add(s[0]-65, s[2]-65);
                topsort1(n);
                if ((int)tmp.size() < n){
                    printf("Inconsistency found after %d relations.\n", i);
                    ok = 1;
                    break;
                }
                if (topsort(n)){
                    ok = 1;
                    printf("Sorted sequence determined after %d relations: ", i);
                    for (int j = 0; j < (int)tsort.size(); j ++){
                        printf("%c", tsort[j]+65);
                    }
                    puts(".");
                    break;
                }
            }
            for (i ++;i <= m; i ++){
                scanf("%s", s);
            }
            if (ok == 0){
                puts("Sorted sequence cannot be determined.");
            }
        }
    	return 0;
    }
    
     
    举杯独醉,饮罢飞雪,茫然又一年岁。 ------AbandonZHANG
  • 相关阅读:
    微信小程序加密解密 C# 以及 填充无效,无法被移除错误的解决方案 Padding is invalid and cannot be removed
    腾讯云 docker 镜像 dotnet/core sdk aspnet
    ImageMagick PDF到JPG有时会导致黑色背景
    VS2019 发布单文件
    MySQL 更新语句执行过程 WAL redolog binlog
    MySQL 查询语句执行过程
    让MySQL为我们记录执行流程
    SQL基础随记1 SQL分类 常用函数 ALL ANY EXISTS IN 约束
    初用MySQL Mysql示例库 Navicat15
    OldTrafford after 102 days
  • 原文地址:https://www.cnblogs.com/AbandonZHANG/p/4114024.html
Copyright © 2011-2022 走看看