#include <bits/stdc++.h>
using namespace std;
void make_set(int p[], int sz[], int n)
{
for(int i=0; i<n; i++)
{
p[i]=i;
sz[i]=1;
}
}
int Find(int i, int p[])
{
if(i==p[i])
return p[i];
return p[i]=Find(p[i], p);
}
void Union(int a, int b, int p[], int sz[])
{
a=Find(a, p);
b=Find(b, p);
if(a==b)
return;
if(sz[a]<sz[b])
swap(a, b);
sz[a]+=sz[b];
p[b]=p[a];
}
int main()
{
int n;
cin>>n;
map<string, int>str_to_int;
int graph[n];
int index=0;
string aa, bb;
int p[n], sz[n];
make_set(p, sz, n);
for(int i=0; i<n; i++)
{
cin>>aa>>bb;
if(str_to_int.find(aa)==str_to_int.end())
{
str_to_int[aa]=index;
index++;
}
if(str_to_int.find(bb)==str_to_int.end())
{
str_to_int[bb]=index;
index++;
}
graph[str_to_int[aa]]=str_to_int[bb];
Union(str_to_int[aa], str_to_int[bb], p, sz);
}
if(n%2==1)
{
cout<<-1;
return 0;
}
bool vis[n];
memset(vis, 0, sizeof(vis));
int par;
long long int sol=0;
for(int i=0; i<n; i++)
{
par=Find(i, p);
if(!vis[par])
{
sol+=(sz[par]+1)/2;
vis[par]=1;
}
}
cout<<sol;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |