奇奇怪怪的二分图匹配
匈牙利模板题
标记每个可以使用的两种缩写,第一种不可以就标记为-1
map<string,int>mp1;
string str1[1005][2];
vector<int>vt[2005];
int mp2[1005][2];
int vis[2005],vis2[2005];
int fa[2005];
bool dfs(int x){
for(int i=0;i<2;i++){
int v=mp2[x][i];
if(v==-1||vis2[v]) continue;
vis2[v]=1;
if(!fa[v]||dfs(fa[v])){
vis[x]=i;
fa[v]=x;
return true;
}
}
return false;
}
void solve(){
int n;
cin>>n;
int cnt=0;
for(int i=1;i<=n;i++){
cin>>str1[i][0]>>str1[i][1];
string str2;
str2=str1[i][0].substr(0,3);
if(mp1[str2]){
vt[mp1[str2]].push_back(i);
}else{
vt[mp1[str2]=++cnt].push_back(i);
}
mp2[i][0]=mp1[str2];
str2=str1[i][0].substr(0,2)+str1[i][1][0];
//cout<<str2<<endl;
if(mp1[str2]){
vt[mp1[str2]].push_back(i);
}else{
vt[mp1[str2]=++cnt].push_back(i);
}
mp2[i][1]=mp1[str2];
}
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
if(str1[i][0].substr(1,3)==str1[j][0].substr(1,3)){
mp2[i][0]=mp2[j][0]=-1;
}
}
}
int ans=0;
for(int i=1;i<=n;i++){
memset(vis2,0,sizeof vis2);
if(dfs(i)){
ans++;
continue;
}
cout<<"NO"<<endl;
return;
}
cout<<"YES"<<endl;
for(int i=1;i<=n;i++){
if(vis[i]){
cout<<str1[i][0][0];
cout<<str1[i][0][1];
cout<<str1[i][1][0]<<endl;
}else{
cout<<str1[i][0][0];
cout<<str1[i][0][1];
cout<<str1[i][0][2]<<endl;
}
}
}