常州大学新生寒假训练会试 I 合成反应

 1 题目描述
 2 有机合成是指从较简单的化合物或单质经化学反应合成有机物的过程。
 3 有时也包括从复杂原料降解为较简单化合物的过程。
 4 由于有机化合物的各种特点,尤其是碳与碳之间以共价键相连,有机合成比较困难,常常要用加热、光照、加催化剂、加有机溶剂甚至加压等反应条件。
 5 但是前人为有机合成提供了许多宝贵的经验。
 6 现在已知有K总物质和N个前人已经总结出的合成反应方程式
 7 小星想知道在现有M种物质的情况下 能否合成某些物质。
 8 输入描述:
 9 第一行输入四个整数 K,N,M,Q(K,N,M,Q<=1e5)
10 K表示一共K总物质
11 接下来N行 每行三个数字a b c(任意两个数可能相等)
12 表示a和b反应可以生成c 反应是可逆的
13 即可以通过c可以分解出a和b
14 接下来一行行然后输入m个数,表示m种原料(每一种原料都可以认为有无限多)
15 接下来Q个行Q个询问
16 对于每个询问
17 输出一个数字 x 判断是否可以通过一些反应得到第 x
18 输出描述:
19 可以得到Yes否则No
20 示例1
21 输入
22 复制
23 10 3 4 10
24 1 2 3
25 4 5 6
26 2 5 7
27 3 4 5 8
28 1
29 2
30 3
31 4
32 5
33 6
34 7
35 8
36 9
37 10
38 输出
39 复制
40 Yes
41 Yes
42 Yes
43 Yes
44 Yes
45 Yes
46 Yes
47 Yes
48 No
49 No
50 说明
51 一共10总物质有第3,4,5,8 四种原料
52 查询每一种是否可以通过反应得到
53 首先通过3可以分解得到1 2
54 然后4 5合成6
55 2 5合成7
56 于是除了9 10都可以得到
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int N =1e5+10;
int  head[N];
bool vis[N];
int n,m,k,q;
int a,b,c,x,cnt;
struct Edge{
    int fr,to,val,nex;
}e[N*4];//add了4次
void add(int a,int b,int c){
    e[cnt].fr=a;
    e[cnt].val=b;
    e[cnt].to=c;
    e[cnt].nex=head[a];
    head[a]=cnt++;
}
queue<int>Q;
void bfs(){
    while(!Q.empty()){
        int  u= Q.front();
        Q.pop();
        for(int i=head[u];i!=-1;i=e[i].nex){
            Edge ee =e[i];
            if(vis[e[i].to]) continue;
            if(e[i].val==-1||vis[e[i].val]){
                vis[e[i].to]=1;
                Q.push(e[i].to);
            }
        }
    }
}
int  main()
{
    while(~scanf("%d%d%d%d",&n,&m,&k,&q)){
        memset(head,-1,sizeof(head));
        memset(vis,0,sizeof(vis));
        cnt=0;
        for(int  i=0;i<m;i++){
           scanf("%d%d%d",&a,&b,&c)    ;
           add(a,b,c);
           add(b,a,c);
           add(c,-1,a);
           add(c,-1,b);
        }
        for(int i=0;i<k;i++){
            scanf("%d",&x);
            vis[x]=1;
            Q.push(x);
        }
        bfs();
        while(q--){
            scanf("%d",&x);
            if(vis[x]){
                printf("Yes\n");
            }
            else
            printf("No\n");
        }

    }
    return 0;
 } 

原文地址:https://www.cnblogs.com/tingtin/p/10505642.html

时间: 2024-10-01 00:28:57

常州大学新生寒假训练会试 I 合成反应的相关文章

常州大学新生寒假训练会试 题解

[题目链接] A - 添加逗号 注意是从后往前三个三个加逗号,最前面不允许有逗号 #include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10; char s[maxn]; char ans[maxn]; int sz; int main() { scanf("%s", s); int len = strlen(s); sz = 0; int t = 0; for(int i = len -

模板方法模式 - 大学新生报到案例

每年9月份,大学生开学季,社会主义的接班人们将进入向往的大学学习..... 大学报到有一个流程,咱们目前就简单分为两步,1.找学校,2.交学费 任何专业的学生都要执行找学校,但是每个专业的学生的学费价格有所不同 那我们就来实现大学报到. 一.报到第一步:找学校. 报到第一步找学校,这点就不用解释了.. public abstract class Register { /** * 去学校 */ public final void goToSchool() { System.out.println(

NUC-ACM/ICPC 寒假训练 简单DP A - G题

第一题:数塔 HDU - 2084 做法: 从第 i , j 个 节点往下走的最优解可以由从第 i+1,j 个节点往下走的最优解和第i+1,j+1个节点往下走的最优解得出,二者取其优即可. 代码: 记忆化搜素 1 #include<iostream> 2 using namespace std; 3 #include<cstdio> 4 using namespace std; 5 int n; 6 int f[100][100]; 7 int v[100][100]; 8 int

FZU ICPC 2020 寒假训练 4 —— 模拟(一)

P1042 乒乓球 题目背景 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及.其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役.华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响.在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙. 题目描述 华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(

FJUT2017寒假训练二题解

A题 题意:让你找出唯一的一个四位数,满足对话时的要求. 思路:因为是4位数,可以直接从1000-9999遍历一遍,判断是否有唯一的数能满足所有条件,如果不是唯一的或者没有满足条件的数就输出Not sure.特别丑的代码附上... 1 #include<stdio.h> 2 int a[10000],b[10000],c[10000]; 3 int main() 4 { 5 int n; 6 while(~scanf("%d",&n)) 7 { 8 if(n==0)

寒假训练第九场 Brocard Point of a Triangle

题意:求布洛卡点坐标 思路:直接利用布洛卡点的性质.http://pan.baidu.com/s/1eQiP76E 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 #include<cstdlib> 6 #include<cstring> 7 #include<cmath> 8 #include<v

zsc_寒假训练 8

Description Ignatius was born in a leap year, so he want to know when he could hold his birthday party. Can you tell him? Given a positive integers Y which indicate the start year, and a positive integer N, your task is to tell the Nth leap year from

寒假训练5解题报告

1.HDU 1114 Piggy Bank 一道简单的背包问题 #include <iostream> #include <cstdio> #include <cstring> using namespace std; #define ll long long const int N = 10005; const int INF = 0x3f3f3f3f; int dp[N]; int main() { // freopen("a.in" , &qu

zsc_寒假训练 5

Description Julius Caesar lived in a time of danger and intrigue. The hardest situation Caesar ever faced was keeping himself alive. In order for him to survive, he decided to create one of the first ciphers. This cipher was so incredibly sound, that