列表

详情


NC15095. 合成反应

描述

有机合成是指从较简单的化合物或单质化学反应合成有机物的过程。
有时也包括从复杂原料降解为较简单化合物的过程。
由于有机化合物的各种特点,尤其是碳与碳之间以共价键相连,有机合成比较困难,常常要用加热、光照、加催化剂、加有机溶剂甚至加压等反应条件。
但是前人为有机合成提供了许多宝贵的经验。
现在已知有K总物质和N个前人已经总结出的合成反应方程式
小星想知道在现有M种物质的情况下 能否合成某些物质。

输入描述

第一行输入四个整数 K,N,M,Q(K,N,M,Q<=1e5)
K表示一共K总物质
接下来N行 每行三个数字a b c(任意两个数可能相等)
表示a和b反应可以生成c 反应是可逆的
即可以通过c可以分解出a和b
接下来一行行然后输入m个数,表示m种原料(每一种原料都可以认为有无限多)
接下来Q个行Q个询问
对于每个询问
输出一个数字 x 判断是否可以通过一些反应得到第 x

输出描述

可以得到Yes否则No

示例1

输入:

10 3 4 10
1 2 3
4 5 6
2 5 7
3 4 5 8
1
2
3
4
5
6
7
8
9
10

输出:

Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No

说明:

一共10总物质有第3,4,5,8 四种原料
查询每一种是否可以通过反应得到
首先通过3可以分解得到1 2
然后4 5合成6
2 5合成7
于是除了9 10都可以得到

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 317ms, 内存消耗: 4548K, 提交时间: 2020-02-29 18:26:54

#include<bits/stdc++.h>
using namespace std;
#define maxn 100001
int a[maxn],b[maxn],c[maxn],f[maxn];
int main()
{
	int k,n,m,q,i,j,d,x;
	cin>>k>>n>>m>>q;
	for(i=0;i<n;i++)
	cin>>a[i]>>b[i]>>c[i];
	for(i=0;i<m;i++)
	{
		cin>>d;
		f[d]=1;
	}
	d=sqrt(n);
	while(d--)
	for(j=0;j<n;j++)
	{
		if(f[a[j]]&&f[b[j]])
		f[c[j]]=1;
		else if(f[c[j]])
		f[a[j]]=1,f[b[j]]=1;
	}
	while(q--)
	{
		cin>>x;
		if(f[x])
		cout<<"Yes"<<endl;
		else 
		cout<<"No"<<endl;
	}
	return 0;
}

上一题