#include #include #include #include // getchar_unlocked or getchar #define getChar getchar_unlocked using namespace std; // http://www.algorytm.edu.pl/fast-i-o.html inline void wczytajLiczbe(int *liczba) { register char c = 0; register int znak_liczby = 1; while(c < 33) c = getChar(); if(c == 45) { znak_liczby = -1; c = getChar(); } (*liczba) = 0; while(c > 32) { (*liczba) = (*liczba) * 10ULL + (c - 48); c = getChar(); } (*liczba) *= znak_liczby; } class Sztab { public: int idSztabu; int kosztKampaniiA; int kosztKampaniiB; Sztab(int idTworzonegoSztabu) { idSztabu = idTworzonegoSztabu; kosztKampaniiA = 0; kosztKampaniiB = 0; } }; class Miasto { public: int idMiasta; Sztab* zwyciezcaA; Sztab* zwyciezcaB; Sztab* zwyciezcaNastepnejRundyA; Sztab* zwyciezcaNastepnejRundyB; vector listaSasiadow; Miasto(int idTworzonegoMiasta) { idMiasta = idTworzonegoMiasta; zwyciezcaA = NULL; zwyciezcaB = NULL; zwyciezcaNastepnejRundyA = NULL; zwyciezcaNastepnejRundyB = NULL; } }; int main() { int iloscMiast = 0; wczytajLiczbe(&iloscMiast); Miasto* tablicaMiast[iloscMiast]; for(int i = 0; i < iloscMiast; ++i) { tablicaMiast[i] = new Miasto(i); } int sasiad1; int sasiad2; wczytajLiczbe(&sasiad1); wczytajLiczbe(&sasiad2); while(sasiad1 != -1) { tablicaMiast[sasiad1]->listaSasiadow.push_back(tablicaMiast[sasiad2]); tablicaMiast[sasiad2]->listaSasiadow.push_back(tablicaMiast[sasiad1]); wczytajLiczbe(&sasiad1); wczytajLiczbe(&sasiad2); } int iloscStartowychSztabow = 0; wczytajLiczbe(&iloscStartowychSztabow); Sztab* tablicaSztabow[iloscStartowychSztabow]; map miastaDoPrzeprowadzeniaWyborow; int miastoStartoweSztabu; for(int i = 0; i < iloscStartowychSztabow; ++i) { wczytajLiczbe(&miastoStartoweSztabu); tablicaSztabow[i] = new Sztab(i); ++(tablicaSztabow[i]->kosztKampaniiA); tablicaMiast[miastoStartoweSztabu]->zwyciezcaA = tablicaSztabow[i]; ++(tablicaSztabow[i]->kosztKampaniiB); tablicaMiast[miastoStartoweSztabu]->zwyciezcaB = tablicaSztabow[i]; for(vector::iterator it=tablicaMiast[miastoStartoweSztabu]->listaSasiadow.begin(); it!=tablicaMiast[miastoStartoweSztabu]->listaSasiadow.end(); ++it) { miastaDoPrzeprowadzeniaWyborow[*it] = NULL; } } map miastaWKtorychSaAktualnieWybory; vector miastaWKtorychPrzeprowadzonoWybory; map glosyNaSztabyMetodaA; map glosyNaSztabyMetodaB; while(!miastaDoPrzeprowadzeniaWyborow.empty()) { miastaWKtorychSaAktualnieWybory.clear(); miastaWKtorychSaAktualnieWybory = miastaDoPrzeprowadzeniaWyborow; miastaDoPrzeprowadzeniaWyborow.clear(); for(map::iterator it=miastaWKtorychSaAktualnieWybory.begin(); it!=miastaWKtorychSaAktualnieWybory.end(); ++it) { register Miasto* odwiedzaneMiasto = it->first; if(odwiedzaneMiasto->zwyciezcaA == NULL) { for(vector::iterator iteratorSasiad=odwiedzaneMiasto->listaSasiadow.begin(); iteratorSasiad!=odwiedzaneMiasto->listaSasiadow.end(); ++iteratorSasiad) { if((*iteratorSasiad)->zwyciezcaA) { glosyNaSztabyMetodaA[(*iteratorSasiad)->zwyciezcaA]++; glosyNaSztabyMetodaB[(*iteratorSasiad)->zwyciezcaB]++; } else { miastaDoPrzeprowadzeniaWyborow[(*iteratorSasiad)] = NULL; } } register Sztab* zwyciezajacySztab; register int iloscGlosowZwyciezajacego = 9999999; for(map::iterator iteratorGlosyNaSztabA=glosyNaSztabyMetodaA.begin(); iteratorGlosyNaSztabA!=glosyNaSztabyMetodaA.end(); ++iteratorGlosyNaSztabA) { if(iteratorGlosyNaSztabA->second < iloscGlosowZwyciezajacego || (iteratorGlosyNaSztabA->second == iloscGlosowZwyciezajacego && iteratorGlosyNaSztabA->first->idSztabu > zwyciezajacySztab->idSztabu)) { zwyciezajacySztab = iteratorGlosyNaSztabA->first; iloscGlosowZwyciezajacego = iteratorGlosyNaSztabA->second; } } ++(zwyciezajacySztab->kosztKampaniiA); odwiedzaneMiasto->zwyciezcaNastepnejRundyA = zwyciezajacySztab; zwyciezajacySztab = NULL; iloscGlosowZwyciezajacego = 0; for(map::iterator iteratorGlosyNaSztabB=glosyNaSztabyMetodaB.begin(); iteratorGlosyNaSztabB!=glosyNaSztabyMetodaB.end(); ++iteratorGlosyNaSztabB) { if(iteratorGlosyNaSztabB->second > iloscGlosowZwyciezajacego || (iteratorGlosyNaSztabB->second == iloscGlosowZwyciezajacego && iteratorGlosyNaSztabB->first->idSztabu < zwyciezajacySztab->idSztabu)) { zwyciezajacySztab = iteratorGlosyNaSztabB->first; iloscGlosowZwyciezajacego = iteratorGlosyNaSztabB->second; } } ++(zwyciezajacySztab->kosztKampaniiB); odwiedzaneMiasto->zwyciezcaNastepnejRundyB = zwyciezajacySztab; glosyNaSztabyMetodaA.clear(); glosyNaSztabyMetodaB.clear(); miastaWKtorychPrzeprowadzonoWybory.push_back(odwiedzaneMiasto); } } for(vector::iterator iteratorMiastoWKtorymPrzeprowadzonoWybory=miastaWKtorychPrzeprowadzonoWybory.begin(); iteratorMiastoWKtorymPrzeprowadzonoWybory!=miastaWKtorychPrzeprowadzonoWybory.end(); ++iteratorMiastoWKtorymPrzeprowadzonoWybory) { (*iteratorMiastoWKtorymPrzeprowadzonoWybory)->zwyciezcaA = (*iteratorMiastoWKtorymPrzeprowadzonoWybory)->zwyciezcaNastepnejRundyA; (*iteratorMiastoWKtorymPrzeprowadzonoWybory)->zwyciezcaB = (*iteratorMiastoWKtorymPrzeprowadzonoWybory)->zwyciezcaNastepnejRundyB; } miastaWKtorychPrzeprowadzonoWybory.clear(); } for(int i = 0; i < iloscStartowychSztabow; ++i) { cout << tablicaSztabow[i]->kosztKampaniiA << " " << tablicaSztabow[i]->kosztKampaniiB << "\n"; } return 0; }