zoukankan      html  css  js  c++  java
  • 【POJ1094】Sorting it all out

    题目链接:https://www.acwing.com/problem/content/345/

    题目大意:给定 (m) 个不等式关系 , 确定变量间的大小关系 , 或找出不等式关系间的矛盾

    solution

    如果(i < j) , (j < k) , 则 (i < k) ,因此这些不等式关系间具有传递性 , 所以这是一道经典的传递闭包问题 ,可以用(Floyd) 传递关系

    (g[i][j] = 1) 表示 (i < j) , (g[i][j] = 0) 表示 (i geq j) 或不确定 , 其中(g[i][j]) |= (g[i][k]) & (g[k][j]) , 最后依次遍历 , 如果 (g[i][j] = 1)(g[j][i] = 1) , 则发生矛盾 , 如果 (g[i][j] = 0)(g[j][i] = 0) , 则无法确定 , 否则 , 可以确定 (i)(j) 之间的唯一关系 , 输出时每次找到最小的输出并排除即可

    时间复杂度: (O(mn^2))

    code

    #include<bits/stdc++.h>
    using namespace std;
    template <typename T> inline void read(T &FF) {
    	int RR = 1; FF = 0; char CH = getchar();
    	for(; !isdigit(CH); CH = getchar()) if(CH == '-') RR = -RR;
    	for(; isdigit(CH); CH = getchar()) FF = FF * 10 + CH - 48;
    	FF *= RR;
    }
    inline void file(string str) {
    	freopen((str + ".in").c_str(), "r", stdin);
    	freopen((str + ".out").c_str(), "w", stdout);
    }
    const int N = 1e3 + 10;
    char ai, bi, ci;
    int pd[N][2], g[30][30], n, m;
    int check(int xi) {
    	memset(g, 0, sizeof(g));
    	for(int i = 1; i <= xi; i++)
    		g[pd[i][0]][pd[i][1]] = true;
    	for(int k = 1; k <= n; k++)
    		for(int i = 1; i <= n; i++)
    			for(int j = 1; j <= n; j++)
    				g[i][j] |= g[i][k] & g[k][j];
    	int flag = 0;
    	for(int i = 1; i <= n; i++)	
    		for(int j = 1; j <= n; j++)
    			if(i != j) {
    				if(g[i][j] && g[j][i]) return false;
    				else if(!g[i][j] && !g[j][i]) flag = true;
    			} 
    			else if(g[i][j] == 1) return false;
    	return flag + 1;
    }
    void print(int xi) {
    	printf("Sorted sequence determined after %d relations: ", xi);
    	int out[30] = {0};
    	for(int i = 1; i <= n; i++) {
    		for(int j = 1; j <= n; j++)
    			if(!out[j]) {
    				int flag = 0;
    				for(int k = 1; k <= n; k++)
    					if(!out[k] && g[k][j]) {
    						flag = 1;
    						break;
    					}
    				if(!flag) {
    					cout << char(j + 'A' - 1), out[j] = 1;
    					break;
    				}
    			}
    	}
    	cout << "." << endl;
    }
    int main() {
    	//file("");
    	while(true) {
    		read(n), read(m);
    		if(!n && !m) break;
    		for(int i = 1; i <= m; i++) {
    			cin >> ai >> bi >> ci;
    			if(bi == '<') pd[i][0] = ai - 'A' + 1, pd[i][1] = ci - 'A' + 1; 
    			else pd[i][1] = ai - 'A' + 1, pd[i][0] = ci - 'A' + 1;
    		}
    		int fg = 0;
    		for(int i = 1; i <= m; i++)
    			if(!check(i)) {
    				printf("Inconsistency found after %d relations.
    ", i);
    				fg = 1; break;
    			}
    			else if(check(i) == 1) {
    				print(i);fg = 1; break;
    			}
    		if(fg)  continue;
    		puts("Sorted sequence cannot be determined.");
    	}
    	return 0;
    }
    
    
    
  • 相关阅读:
    nginx升级总结,漏洞升级
    【BUG解决】在git上pull时提示You have not concluded your merge. (MERGE_HEAD exists)
    如何自签名把http网站变成https网站(https自签名方法)
    ifly
    Shell排序和二叉树排序
    C/C++复习笔记(2)
    C/C++复习笔记(1)
    C语言字符串操作
    python+flask
    C语言的一点复习
  • 原文地址:https://www.cnblogs.com/magicduck/p/12241598.html
Copyright © 2011-2022 走看看