
Untitled
By: a guest on
May 5th, 2012 | syntax:
C++ | size: 2.58 KB | hits: 13 | expires: Never
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <vector>
#include <map>
using namespace std;
long n,i,t1,t2,m,d[100000],ans,clr[100000],t,bst[1000][1000],j;
map<string,long> mp;
bool boo,fix[100000];
vector <long> a1,a2,v[100000];
string s1[100000],s2[100000],s[100000];
void go(long k)
{
fix[k]=true;
clr[k]=t;
bst[t][0]++;
bst[t][bst[t][0]]=k;
long i;
for(i=0;i<v[k].size();i++)
if(!fix[v[k][i]]) go(v[k][i]);
}
void pnt(long k,long c)
{
long i;
clr[k]=c;
bst[c][0]++;
bst[c][bst[c][0]]=k;
for(i=0;i<v[k].size();i++)
if(clr[v[k][i]]!=c) pnt(v[k][i],c);
}
long fndbst(long k)
{
long i,ans;
ans=bst[k][1];
for(i=1;i<=bst[k][0];i++)
if(d[bst[k][i]]%2) {ans=bst[k][i];break;}
return ans;
}
main()
{
freopen("voyage.in","r",stdin);
freopen("voyage.out","w",stdout);
n=1;
s[0]="BATUMI";
mp[s[0]]=1;
cin>>m;
for(i=1;i<=m;i++)
{
cin>>s1[i]>>s2[i];
if(!mp[s1[i]]) {s[n++]=s1[i]; mp[s1[i]]=n; }
if(!mp[s2[i]]) {s[n++]=s2[i]; mp[s2[i]]=n; }
}
for(i=1;i<=m;i++)
{
d[mp[s1[i]]]++;
d[mp[s2[i]]]++;
v[mp[s1[i]]].push_back(mp[s2[i]]);
v[mp[s2[i]]].push_back(mp[s1[i]]);
}
for(i=1;i<=n;i++)
if(!fix[i]) {t++; go(i);}
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if (clr[i]!=clr[j]) {
ans++;
t1=fndbst(clr[i]);
t2=fndbst(clr[j]);
a1.push_back(t1-1);
a2.push_back(t2-1);
d[t1]++;
d[t2]++;
pnt(t2,clr[i]);
}
while(1)
{
boo=false;
for(i=1;i<=n;i++)
if(d[i]%2) {boo=true;break;}
if (!boo) break;
ans++;
t1=0;
t2=0;
for(i=1;i<=n;i++)
if((d[i]%2)|(d[i]==0)) {t1=i; break;}
for(i=t1+1;i<=n;i++)
if((d[i]%2)|(d[i]==0)) {t2=i; break;}
d[t1]++;
d[t2]++;
a1.push_back(t1-1);
a2.push_back(t2-1);
}
cout<<ans<<endl;
for(i=0;i<ans;i++)
cout<<s[a1[i]]<<" "<<s[a2[i]]<<endl;
}