11119

#include <iostream>

#include <map>
#include <stdio.h>
#include <string>
#include <string.h>
#include <vector>
#include <algorithm>

using namespace std;

map<string,int> cat;
map<string,int> an;

map<int,string> _cat;
map<int,string> _an;

vector<string> vb[110];
vector<int> vcat,ancat;

int pri_cat[110][110];
int pri_an[110][110];

string s[110];
string S1[110],S2[110];

int Nc,Na,mix;

struct msr{
int weight;
int pos;
}pwr[110];

bool cmp(msr a,msr b)
{
return a.weight>b.weight;
}

int StableMarriage()
{
bool mCat[110];
int fAn[110];
int p;
map<int,string> couple;
int freeCount=vcat.size();

for(int i=0;i<vcat.size();i++)
{
mCat[i]=true;
fAn[i]=-1;
}

while(freeCount>0)
{
int m;
if(freeCount==0)
break;
for(int i=0;i<vcat.size();i++)
{
if(mCat[i]==true)
{
m=vcat[i];
p=i;
break;
}
}

for(int i=0;i<ancat.size();i++)
{
pwr[i].weight=pri_cat[m][ancat[i]];
pwr[i].pos=i;
}
sort(pwr,pwr+ancat.size(),cmp);

while(mCat[p])
{
int w=0;
int select_an;

//cout<<pwr[0].weight<<" "<<pwr[0].pos<<"\n";
//getchar();
for(int z=0;z<ancat.size();z++)
{
select_an=pwr[z].pos;
if(fAn[select_an]==-1)
{
fAn[select_an]=p;
mCat[p]=false;
freeCount--;
string st=_cat[vcat[p]];
st.append(_an[ancat[select_an]]);
couple[p+1]="";
//cout<<st<<" "<<p+1<<"\n";
//if(freeCount!=0)
couple[p+1]=st;
break;
}
else
{
int m1=fAn[select_an];
if(pri_an[ancat[select_an]][m]>pri_an[ancat[select_an]][vcat[m1]])
{
mCat[p]=false;
mCat[m1]=true;
fAn[select_an]=p;
string st=_cat[vcat[p]];
st.append(_an[ancat[select_an]]);
//if(freeCount!=0)
couple[p+1]=st;
//cout<<st<<" = "<<p+1<<"\n";
break;
}
}
}
if(mCat[p]==false)
break;
}
}

int cntr=0;

for(map<int,string>::iterator it=couple.begin();it!=couple.end();++it)
{
if(cntr<=mix-2)
cout<<it->second<<" ";
else
cout<<it->second;
cntr+=1;

}
cout<<"\n\n";
return 0;
}
int main()
{
int a,c=0,m;
string str;

while(cin>>Nc)
{
if(Nc==0)
break;
c+=1;
cat.clear();
an.clear();
int k=1;
for(int i=0;i<Nc;i++)
{
cin>>str;
if(cat[str]==0)
{
cat[str]=k;
_cat[k-1]=str;
k++;
}
}
cin>>Na;
k=1;
for(int i=0;i<Na;i++)
{
cin>>str;
if(an[str]==0)
{
an[str]=k;
_an[k-1]=str;
k++;
}
}

for(int i=0;i<Nc;i++)
{
for(int j=0;j<Na;j++)
{
cin>>a;
pri_cat[i][j]=a;
}
}

for(int i=0;i<Na;i++)
{
for(int j=0;j<Nc;j++)
{
cin>>a;
pri_an[i][j]=a;
}
}
m=0;
while(cin>>mix)
{
if(mix==0)
break;
m+=1;
_an.clear();
_cat.clear();
vcat.clear();
ancat.clear();
for(int i=0;i<mix;i++)
{
cin>>s[i];
S1[i]="";
S2[i]="";
S1[i].append(1u,s[i][0]);
S1[i].append(1u,s[i][1]);
int y=cat[S1[i]];
_cat[y-1]=S1[i];
vcat.push_back(y-1);

S2[i].append(1u,s[i][2]);
S2[i].append(1u,s[i][3]);
y=an[S2[i]];
_an[y-1]=S2[i];
ancat.push_back(y-1);
}

cout<<"Scenario "<<c<<", Mixture "<<m<<":\n";
StableMarriage();
}
}//end while

return 0;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *