NOI 2015 程序自动分析

来源:互联网 发布:可米小子诅咒 知乎 编辑:程序博客网 时间:2024/04/26 06:00

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


【题目分析】
先离散化,然后再解决等于的情况(并查集),最后在进行判断。


【代码】

#include<cstdio>#include<cstring>#include<map>using namespace std;map<int, int> f;int p[1000005][2];int n, len;int getf(int x){    if (x == f[x]) return x;    return f[x] = getf(f[x]);}int main(){    int Test;    scanf("%d", &Test);    while (Test--)    {        scanf("%d", &n);        len = 0;        f.clear();        for (int i = 0; i < n; ++i)        {            int x, y, e;            scanf("%d%d%d", &x, &y, &e);            if (!f.count(x)) f[x] = x;            if (!f.count(y)) f[y] = y;            if (e)            {                int tx = getf(x), ty = getf(y);                f[ty] = tx;            }            else            {                p[len][0] = x;                p[len++][1] = y;            }        }        bool flag = true;        for (int i = 0; i < len; ++i)        {            int tx = getf(p[i][0]), ty = getf(p[i][1]);            if (tx == ty)             {                flag = false;                break;            }        }        if (flag) printf("YES\n");        else printf("NO\n");    }    return 0;}
0 0
原创粉丝点击