考虑到一个集合内的存在与否的特点,想到并查集。 拒绝装车->与已装的化合物形成易燃物。 简单并查集的应用。
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<set> #include<queue> #include<algorithm> #include<vector> #include<cstdlib> #include<cmath> #include<ctime> #include<stack> #define rez(i,x,y) for(int i=x;i>=y;i--) #define res(i,x,y) for(int i=x;i<=y;i++) #define INF 2100000000 #define ll long long #define clr(x) memset(x,0,sizeof(x)) using namespace std; const int maxn = 100000+50; int f[maxn],a,b,tot=0; int findset(int x){ return f[x]!=x?f[x]=findset(f[x]):x; } int main(){ for(int i=1;i<=maxn;i++)f[i]=i; while(scanf("%d",&a)!=EOF){ if(a==-1){ cout<<tot<<endl; tot=0; for(int i=1;i<=maxn;i++)f[i]=i; }else{ scanf("%d",&b); a=findset(a),b=findset(b); if(a==b)++tot; else f[a]=b; } } return 0; }大水题回顾系列。