1. 程式人生 > >常州大學新生寒假訓練會試 I 合成反應

常州大學新生寒假訓練會試 I 合成反應

情況下 否則 示例 四種 加壓 turn 無限 ios 方程式

 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,458 四種原料 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; }

常州大學新生寒假訓練會試 I 合成反應