链接
https://vjudge.net/problem/UVA-1160
题解
这题有点图论的感觉
把元素看成是点,化合物看作一条边
如果有一个子图包含
k
k
k个点、
k
k
k条边,那么就满足了题目中所述不合法的条件
边数=点数的无向图中肯定有环
那就是说我不断的往里加边,如果某条边成环了,就不要这条边
用并查集维护连通分量即可
代码
#include <bits/stdc++.h>
#define maxn 100010
using namespace std;
typedef long long ll;
class MFS
{
private:
ll f[maxn] ,N;
public:
void init(ll n)
{
N=n;
for(auto i=0;i<=N;i++)f[i]=i;
}
ll find(ll x)
{
return x==f[x]?x:f[x]=find(f[x]);
}
void merge(ll a, ll b)
{
f[find(a)] = find(b);
}
}mfs;
ll read(ll x=0)
{
ll c, f=1;
for(c=getchar();!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar())x=x*10+c-48;
return f*x;
}
int main()
{
ll a, b, cnt(0ll);
mfs.init(100000);
while(~scanf("%lld",&a))
{
if(a==-1)
{
printf("%lld\n",cnt);
cnt=0;
mfs.init(100000);
continue;
}
b=read();
if(mfs.find(a)!=mfs.find(b))mfs.merge(a,b);
else cnt++;
}
return 0;
}