fork download
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define ll long long
  6.  
  7. // map<int,vector<int>>adj;
  8. vector<int>adj[1000001];
  9. int cc_cnt = 0;
  10. // map<int,bool>vis;
  11. int vis[1000001];
  12. // vector<int>cc(1000001,0);
  13. int cc[1000001];
  14. // int find(int a,int par[]){
  15. // if(par[a]<0)
  16. // return a;
  17. // return par[a] = find(par[a],par);
  18. // }
  19. // void unionset(int a,int b,int par[]){
  20. // int para = find(a,par);
  21. // int parb = find(b,par);
  22. // if(para!=parb){
  23. // par[para]+=par[parb];
  24. // par[parb] = para;
  25. // }
  26. // }
  27.  
  28. void dfs(int x){
  29. vis[x] = 1;
  30. cc[x] = cc_cnt;
  31. for(int neigh:adj[x])
  32. if(vis[neigh]==0)
  33. dfs(neigh);
  34.  
  35. }
  36.  
  37. int main(){
  38. int t;
  39. cin>>t;
  40. while(t--){
  41. // adj.clear();
  42. int n,k;
  43. cin>>n>>k;
  44. int flag = 1;
  45. vector<pair<int,int>>queries;
  46. for(int i=0;i<=n;i++){
  47. vis[i] = 0;
  48. adj[i].clear();
  49. }
  50. for(int i =0;i<=n;i++)
  51. cc[i] = 0;
  52. cc_cnt =0;
  53. while(k--){
  54. int x1,x2;
  55. string op;
  56. cin>>x1>>op>>x2;
  57. if(op=="="){
  58. adj[x1].push_back(x2);
  59. adj[x2].push_back(x1);
  60. }
  61. else
  62. queries.push_back({x1,x2});
  63. }
  64.  
  65. for(int i = 1;i<=n;i++){
  66. if(vis[i]==0){
  67. cc_cnt++;
  68. dfs(i);
  69. }
  70. }
  71. for(int i =0;i<queries.size();i++){
  72. int a = queries[i].first;
  73. int b = queries[i].second;
  74.  
  75. if(cc[a]==cc[b]){
  76. flag = 0;
  77. break;
  78. }
  79. }
  80.  
  81. if(flag)
  82. cout<<"YES"<<endl;
  83. else
  84. cout<<"NO"<<endl;
  85.  
  86.  
  87. }
  88.  
  89. }
Runtime error #stdin #stdout 0.01s 30620KB
stdin
Standard input is empty
stdout
Standard output is empty