码迷,mamicode.com
首页 > 其他好文 > 详细

[NOI2015]程序自动分析

时间:2018-05-12 23:30:17      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:假设   ios   ++   文件的   版本   引号   因此   clu   main   

题目描述

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

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

现在给出一些约束满足问题,请分别对它们进行判定。

输入输出格式

输入格式:

 

从文件prog.in中读入数据。

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

对于每个问题,包含若干行:

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

 

输出格式:

 

输出到文件 prog.out 中。

输出文件包括t行。

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

思路:

这道题能作为NOI2015的题,我也是醉了

难度还不如NOIP

显而易见的这道题是一个带扩展域的并查集

先把所有的满足用并查集跑一边,在跑不满足的

如果不满足条件已经被满足,就说明肯定有冲突,输出即可

特别注意:

别看他数据范围大的吓人,其实没什么大不了的,模个数离散化一下即可

代码:

#include<iostream>
#include<cstdio>
#define rii register int i
#define rij register int j
using namespace std;
int n,opt,t;
long long v1,v2;
int mod=926817;
int x[1000005],f[1000005],bcl1[1000005],jsq,bcl2[1000005];
int find(int x)//并查集标配
{
    if(f[x]!=x)
    {
    	f[x]=find(f[x]);
	}
    return f[x];
}
int main()
{
	scanf("%d",&t);
	for(rii=1;i<=t;i++)
	{
		jsq=0;
		for(rij=1;j<=1000005;j++)
		{
			f[j]=j;
		}
		scanf("%d",&n);
		for(rij=1;j<=n;j++)
		{
			scanf("%lld%lld%d",&v1,&v2,&opt);
			v1=v1%mod;
			v2=v2%mod;
			if(opt==1)
			{
				int ltt=find(v1);
				int kkk=find(v2);
				f[ltt]=kkk;
			}
			else
			{
				jsq++;
				bcl1[jsq]=v1;//存拓展域(其实就是补集)
				bcl2[jsq]=v2;
			}
		}
		int bj=0;
		for(rij=1;j<=jsq;j++)
		{
			if(find(bcl1[j])==find(bcl2[j]))
			{
				printf("NO\n");
				bj=1;
				break;
			}
		}
		if(bj!=1)
		{
			printf("YES\n");
		}
	}
} 

  

[NOI2015]程序自动分析

标签:假设   ios   ++   文件的   版本   引号   因此   clu   main   

原文地址:https://www.cnblogs.com/ztz11/p/9030504.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!