This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define maxn 100050
vector<set<int> > adj(maxn);
vector<vector<int> > fadj(maxn);
vector<int> canuse(maxn,1);
map<string,int> map1;
int currcount = 0;
int ans = 0;
void dfs1(int node,int parent){
for(auto k:fadj[node]){
if(k!=parent&&canuse[k]==1){
dfs1(k,node);
}
}
if(canuse[node]==0){
}
else if(parent!=-1&&canuse[parent]==1){
canuse[node] = 0;
canuse[parent] = 0;
ans++;
}
else{
ans++;
canuse[node] = 0;
}
}
void dfs(int node){
canuse[node] = 0;
currcount++;
for(auto k:fadj[node]){
if(canuse[k]==1){
dfs(k);
}
}
}
int mapper(string a){
if(map1.count(a)==0){
map1.insert({a,map1.size()});
}
return map1[a];
}
int32_t main() {
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int n;
string input1,input2;
int a,b;
cin >> n;
if(n%2==1){
cout << -1;
return 0;
}
vector<int> indeg(maxn,0);
for(int i=0;i<n;i++){
cin >> input1 >> input2;
a = mapper(input1);
b = mapper(input2);
if(a!=b){
fadj[a].push_back(b);
fadj[b].push_back(a);
adj[a].insert(b);
indeg[b]++;
}
}
for(int i=0;i<n;i++){
for(auto k:adj[i]){
if(adj[k].find(i)!=adj[k].end()){
canuse[i] = 0;
canuse[k] = 0;
}
}
}
for(int i=0;i<n;i++){
if(canuse[i]==1&&indeg[i]==0){
dfs1(i,-1);
}
}
for(int i=0;i<n;i++){
if(canuse[i]==1){
dfs(i);
if(currcount%2==1){
ans += currcount/2+1;
}
else{
ans += currcount/2;
}
currcount = 0;
}
}
cout << ans;
}
# | 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... |