#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);
}
bool tc_2=0;
void Union(int a, int b, int p[], int sz[])
{
a=Find(a, p);
b=Find(b, p);
if(a==b)
{
tc_2=1;
return;
}
if(sz[a]<sz[b])
swap(a, b);
sz[a]+=sz[b];
p[b]=p[a];
}
long long rez=0;
void dfs1(vector<int>graph[], int node, int parent, bool visited[])
{
for(int i=0; i<graph[node].size(); i++)
{
if(graph[node][i]!=parent)
dfs1(graph, graph[node][i], node, visited);
}
if(visited[node]==0 && visited[parent]==0)
{
visited[node]=1;
visited[parent]=1;
rez++;
}
if(visited[node]==0 && visited[parent]==1)
{
visited[node]=1;
rez++;
}
}
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);
memset(graph, -1, sizeof(graph));
vector<int>graph_inverse[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];
if(aa!=bb)
Union(str_to_int[aa], str_to_int[bb], p, sz);
graph_inverse[str_to_int[bb]].push_back(str_to_int[aa]);
}
if(n%2==1)
{
cout<<-1;
return 0;
}
if(tc_2)
{
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(sz[par]==2)
continue;
if(!vis[par])
{
sol+=(sz[par]+1)/2;
vis[par]=1;
}
}
cout<<sol;
}
else
{
bool visited[n];
memset(visited, 0, sizeof(visited));
for(int i=0; i<n; i++)
{
if(graph[i]==-1)
{
cout<<-1;
return 0;
}
if(graph[i]!=i && graph[graph[i]]==i)
{
visited[i]=1;
visited[graph[i]]=1;
}
}
for(int i=0; i<n; i++)
{
if(graph[i]==i && visited[i]==0)
{
dfs1(graph_inverse, i, i, visited);
}
}
cout<<rez;
}
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... |