#include #include #include class Kandydat { public: int id; int costA; int costB; Kandydat(int kandydatId) { id = kandydatId; costA = 1; costB = 1; } }; class Miasto { public: int id; Kandydat* zwyciezcaMetodaA; Kandydat* zwyciezcaMetodaB; std::vector sasiednieMiasta; Miasto(int miastoId) { id = miastoId; zwyciezcaMetodaA = NULL; zwyciezcaMetodaB = NULL; } }; class Zwyciezcy { public: Kandydat* zwyciezcaMetodaA; Kandydat* zwyciezcaMetodaB; }; int main(int ac, char** av){ int iloscMiast = 0; int iloscKandydatow = 0; fscanf(stdin, "%d", &iloscMiast); Miasto* miasta[iloscMiast]; for(int i = 0; i < iloscMiast; i++) miasta[i] = new Miasto(i); int sasiednieMiasto1; int sasiednieMiasto2; fscanf(stdin, "%d", &sasiednieMiasto1); fscanf(stdin, "%d", &sasiednieMiasto2); while(sasiednieMiasto1 != -1){ miasta[sasiednieMiasto1]->sasiednieMiasta.push_back(miasta[sasiednieMiasto2]); miasta[sasiednieMiasto2]->sasiednieMiasta.push_back(miasta[sasiednieMiasto1]); fscanf(stdin, "%d", &sasiednieMiasto1); fscanf(stdin, "%d", &sasiednieMiasto2); } fscanf(stdin, "%d", &iloscKandydatow); Kandydat* kandydaci[iloscKandydatow]; std::map* miastaWKtorychBedaWybory = new std::map(); int miastoPierwszegoSztabuKandydata; for(int i = 0; i < iloscKandydatow; i++){ fscanf(stdin, "%d", &miastoPierwszegoSztabuKandydata); kandydaci[i] = new Kandydat(i); for(std::vector::iterator it = miasta[miastoPierwszegoSztabuKandydata]->sasiednieMiasta.begin(); it != miasta[miastoPierwszegoSztabuKandydata]->sasiednieMiasta.end(); ++it) (*miastaWKtorychBedaWybory)[*it] = *it; miasta[miastoPierwszegoSztabuKandydata]->zwyciezcaMetodaA = kandydaci[i]; miasta[miastoPierwszegoSztabuKandydata]->zwyciezcaMetodaB = kandydaci[i]; } std::map* miastaWKtorychSaWybory = new std::map(); std::map zwyciezcyAktualnejRundy; std::map glosyMetodaA; std::map glosyMetodaB; Miasto* aktualneMiasto; Miasto* aktualneMiastoSasiada; while(!miastaWKtorychBedaWybory->empty()) { delete miastaWKtorychSaWybory; miastaWKtorychSaWybory = miastaWKtorychBedaWybory; miastaWKtorychBedaWybory = new std::map(); zwyciezcyAktualnejRundy.clear(); for(std::map::iterator it = miastaWKtorychSaWybory->begin(); it != miastaWKtorychSaWybory->end(); ++it){ aktualneMiasto = it->first; if(aktualneMiasto->zwyciezcaMetodaA == NULL || aktualneMiasto->zwyciezcaMetodaB == NULL){ glosyMetodaA.clear(); glosyMetodaB.clear(); for(std::vector::iterator it = aktualneMiasto->sasiednieMiasta.begin(); it != aktualneMiasto->sasiednieMiasta.end(); ++it){ aktualneMiastoSasiada = *it; if(aktualneMiastoSasiada->zwyciezcaMetodaA){ glosyMetodaA[aktualneMiastoSasiada->zwyciezcaMetodaA]++; glosyMetodaB[aktualneMiastoSasiada->zwyciezcaMetodaB]++; } else (*miastaWKtorychBedaWybory)[aktualneMiastoSasiada] = aktualneMiastoSasiada; } Zwyciezcy* zwyciezcy = new Zwyciezcy(); int wartoscZwyciezajacegoKandydata = 123456; Kandydat* zwyciezajacyKandydat; for(std::map::iterator it=glosyMetodaA.begin(); it!=glosyMetodaA.end(); ++it){ if(it->second < wartoscZwyciezajacegoKandydata || (it->second == wartoscZwyciezajacegoKandydata && it->first->id > zwyciezajacyKandydat->id)){ zwyciezajacyKandydat = it->first; wartoscZwyciezajacegoKandydata = it->second; } } zwyciezcy->zwyciezcaMetodaA = zwyciezajacyKandydat; zwyciezajacyKandydat->costA++; wartoscZwyciezajacegoKandydata = 0; for(std::map::iterator it=glosyMetodaB.begin(); it!=glosyMetodaB.end(); ++it){ if(it->second > wartoscZwyciezajacegoKandydata || (it->second == wartoscZwyciezajacegoKandydata && it->first->id < zwyciezajacyKandydat->id)){ zwyciezajacyKandydat = it->first; wartoscZwyciezajacegoKandydata = it->second; } } zwyciezcy->zwyciezcaMetodaB = zwyciezajacyKandydat; zwyciezajacyKandydat->costB++; zwyciezcyAktualnejRundy[aktualneMiasto] = zwyciezcy; } } for(std::map::iterator it=zwyciezcyAktualnejRundy.begin(); it!=zwyciezcyAktualnejRundy.end(); ++it){ it->first->zwyciezcaMetodaA = it->second->zwyciezcaMetodaA; it->first->zwyciezcaMetodaB = it->second->zwyciezcaMetodaB; } } for(int i = 0; i < iloscKandydatow; i++) fprintf(stdout, "%d %d\n", kandydaci[i]->costA ,kandydaci[i]->costB); return 0; }