zoukankan      html  css  js  c++  java
  • BZOJ4195 程序自动分析

    Description

     在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。

    考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xi=xj或xi≠xj的变量相等/不等的约束 条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足。例如,一个问题中的约束条件 为:x1=x2,x2=x3,x3=x4,x1≠x4,这些约束条件显然是不可能同时被满足的,因此这个问题应判定为不可被满足。
    现在给出一些约束满足问题,请分别对它们进行判定。

    Input

    输入文件的第1行包含1个正整数t,表示需要判定的问题个数。注意这些问题之间是相互独立的。

    对于每个问题,包含若干行:
    第1行包含1个正整数n,表示该问题中需要被满足的约束条件个数。
    接下来n行,每行包括3个整数i,j,e,描述1个相等/不等的约束条件,相邻整数之间用单个空格隔开。若e=1,则该约束条件为xi=xj;若e=0,则该约束条件为xi≠xj。

    Output

    输出文件包括t行。

    输出文件的第k行输出一个字符串“YES”或者“NO”(不包含引号,字母全部大写),“YES”表示输入中的第k个问题判定为可以被满足,“NO”表示不可被满足。

    Sample Input

    2
    2
    1 2 1
    1 2 0
    2
    1 2 1
    2 1 1

    Sample Output

    NO
    YES

    HINT

     在第一个问题中,约束条件为:x1=x2,x1≠x2。这两个约束条件互相矛盾,因此不可被同时满足。

     

    在第二个问题中,约束条件为:x1=x2,x2=x1。这两个约束条件是等价的,可以被同时满足。


    1≤n≤1000000

     

    1≤i,j≤1000000000
     
     
    正解:并查集+(map or离散化)
    解题报告:
      我对这道题真是没有话讲了,首先我打了一个复杂的算法,还二分图染色了一波,后来发现并不需要。然后改了之后交到BZOJ,发发RE,匪夷所思。
      迷之RE,最后解决方案是把带lower_bound的离散化换成了map,然后就AC了,算了,不吐槽BZOJ的鬼畜了。
     
     1 //It is made by jump~
     2 #include <iostream>
     3 #include <cstdlib>
     4 #include <cstring>
     5 #include <cstdio>
     6 #include <cmath>
     7 #include <algorithm>
     8 #include <map>
     9 using namespace std;
    10 typedef long long LL;
    11 const int MAXN = 2000011;
    12 int n,cnt,L;
    13 int father[MAXN*4];
    14 bool ok;
    15 int u[MAXN],v[MAXN],flag[MAXN];
    16 map<int,int>mp;
    17 
    18 inline int getint()
    19 {
    20        int w=0,q=0;
    21        char c=getchar();
    22        while((c<'0' || c>'9') && c!='-') c=getchar();
    23        if (c=='-')  q=1, c=getchar();
    24        while (c>='0' && c<='9') w=w*10+c-'0', c=getchar();
    25        return q ? -w : w;
    26 }
    27 
    28 inline void Init(){ 
    29     mp.clear();
    30     cnt=0;
    31     for(int i=1;i<=n;i++) u[i]=getint(),v[i]=getint(),flag[i]=getint(); 
    32     for(int i=1;i<=n;i++) {
    33     if(!mp[u[i]]) mp[u[i]]=++cnt;
    34     if(!mp[v[i]]) mp[v[i]]=++cnt;
    35     }
    36     for(int i=1;i<=n;i++) u[i]=mp[u[i]],v[i]=mp[v[i]];
    37     for(int i=1;i<=cnt;i++) father[i]=i;
    38 }
    39 
    40 inline int find(int x){  
    41     if(father[x]!=x) father[x]=find(father[x]);
    42     return father[x];
    43 }
    44 
    45 inline void work(){
    46     int T=getint();
    47     while(T--) {
    48     n=getint();Init();       
    49     bool ff=true;int u1,u2;
    50     for(int i=1;i<=n;i++) {
    51         if(!flag[i]) continue;
    52         u1=find(u[i]),u2=find(v[i]);
    53         if(u1!=u2) father[u2]=u1;     
    54     }    
    55     for(int i=1;i<=n;i++) {
    56         if(flag[i]) continue;
    57         u1=find(u[i]),u2=find(v[i]);
    58         if(u1==u2) { ff=false; break; }    
    59     }
    60     if(!ff) printf("NO
    ");
    61     else printf("YES
    ");    
    62     }
    63 }
    64 
    65 int main()
    66 {
    67   work();
    68   return 0;
    69 }
     
  • 相关阅读:
    ArrayList用法
    MessageBox
    将文本文件导入Sql数据库
    在桌面和菜单中添加快捷方式
    泡沫排序
    Making use of localized variables in javascript.
    Remove double empty lines in Visual Studio 2012
    Using Operations Manager Connectors
    Clear SharePoint Designer cache
    Programmatically set navigation settings in SharePoint 2013
  • 原文地址:https://www.cnblogs.com/ljh2000-jump/p/5679468.html
Copyright © 2011-2022 走看看