nowcoder 常州大學 新生 I

ACM_e發表於2018-02-26





/*
連結:https://www.nowcoder.com/acm/contest/78/I
來源:牛客網

題目描述 
有機合成是指從較簡單的化合物或單質經化學反應合成有機物的過程。
有時也包括從複雜原料降解為較簡單化合物的過程。
由於有機化合物的各種特點,尤其是碳與碳之間以共價鍵相連,有機合成比較困難,常常要用加熱、光照、加催化劑、加有機溶劑甚至加壓等反應條件。
但是前人為有機合成提供了許多寶貴的經驗。
現在已知有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都可以得到
*/

#include<bits/stdc++.h>
using namespace std;
#define maxn 100000+100
bool flag[maxn];
vector<int>w[maxn];
/*struct ac{
   int x,y,z;
   ac(){};
   ac(int a,int b,int c){
     x=a;
     y=b;
     z=c;
   }
}a[maxn];*/
//vector<pair<int,int> >w;
bool xxx(int x){
   for(int j=0;j<w[x].size();j+=2){
      int xx=w[x][j];
      int yy=w[x][j+1];
      if(flag[xx]&&flag[yy]){
         return true;
      }
   }
   return false;
}
int main(){
   int k,n,m,q;
   cin>>k>>n>>m>>q;
   for(int j=0;j<n;j++){
      int x,y,z;
      scanf("%d%d%d",&x,&y,&z);
      w[0].push_back(z);
      w[z].push_back(x);
      w[z].push_back(y);
      //a[z].x=x;
      //a[z].y=y;
   }
  // memset(flag,0,sizeof(flag));
   for(int j=0;j<m;j++){
      int x;
      scanf("%d",&x);
      flag[x]=1;
   }
   int ans=0;
   int len1=w[0].size();
   while(ans<=sqrt(k)){
       for(int j=0;j<len1;j++){ //被合成的所有集合
          int x=w[0][j];
          if(flag[x]){        //已經被合成 把他的兒子全部標記為合成
             for(int kk=0;kk<w[x].size();kk++){
                int y=w[x][kk];
                flag[y]=1;
             }
          }
          if(!flag[x]){      //不能被合成
             bool i=0;
             i=xxx(x);    //判斷兒子是否有被合成的
             if(i){
               flag[x]=1;
             }
          }
       }
       ans++;
   }
   for(int j=0;j<q;j++){
     int x;
     scanf("%d",&x);
     printf(flag[x]? "Yes\n":"No\n");
   }
}

相關文章