#include <iostream> #include <vector> #include <algorithm> #include <iterator> #include <cstdint> #include <deque> using namespace std; typedef vector< vector<bool> > Twiedza; int medrcow, zaklec, dni; void utnij_wiedze(Twiedza &wiedza, int m ){ for (int i=0; i<medrcow; i++){ for (int z=0; z<zaklec; z++){ wiedza[i][z]=wiedza[i][z]&&wiedza[m][z]; } } } int ile_wiedzy(const Twiedza & wiedza, int m ){ int c=0; for (int i=0; i<zaklec;i++) c+=wiedza[m][i]; return c; } int wyjdz(Twiedza wiedza, int m, int limit ){ utnij_wiedze(wiedza,m); if (limit==0) return 0; if (ile_wiedzy( wiedza ,m)==0) return 1; int T = limit-1; for (int i=0; i<medrcow; i++){ if (i!=m){ T = min(T, wyjdz(wiedza,i,T)); } } return T+1; } int main(){ int Q; cin>>Q; while (Q-->0){ cin>>medrcow>>zaklec>>dni; vector <pair<int, int>> zaklecia; for (int i=0; i<zaklec; i++){ int a,b; cin>>a>>b; zaklecia.push_back(make_pair(a-1,b-1)); } Twiedza wiedza(medrcow, vector<bool>(zaklec,true)); for (int i=0; i<zaklec; i++){ wiedza[zaklecia[i].first][i]=false; wiedza[zaklecia[i].second][i]=false; } int mind=dni+1; vector <int> wygnancy; for (int m=0; m<medrcow; m++){ int r=wyjdz( wiedza ,m,mind+1); if (r<mind){ wygnancy.clear(); wygnancy.push_back(m+1); mind=r; }else if (r==mind){ wygnancy.push_back(m+1); } } if (mind<=dni){ cout<<mind<<" "<<wygnancy.size()<<endl; copy(begin(wygnancy), end(wygnancy), ostream_iterator<int>(cout," ")); cout<<endl; }else cout<<"-1"<<endl; } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | #include <iostream> #include <vector> #include <algorithm> #include <iterator> #include <cstdint> #include <deque> using namespace std; typedef vector< vector<bool> > Twiedza; int medrcow, zaklec, dni; void utnij_wiedze(Twiedza &wiedza, int m ){ for (int i=0; i<medrcow; i++){ for (int z=0; z<zaklec; z++){ wiedza[i][z]=wiedza[i][z]&&wiedza[m][z]; } } } int ile_wiedzy(const Twiedza & wiedza, int m ){ int c=0; for (int i=0; i<zaklec;i++) c+=wiedza[m][i]; return c; } int wyjdz(Twiedza wiedza, int m, int limit ){ utnij_wiedze(wiedza,m); if (limit==0) return 0; if (ile_wiedzy( wiedza ,m)==0) return 1; int T = limit-1; for (int i=0; i<medrcow; i++){ if (i!=m){ T = min(T, wyjdz(wiedza,i,T)); } } return T+1; } int main(){ int Q; cin>>Q; while (Q-->0){ cin>>medrcow>>zaklec>>dni; vector <pair<int, int>> zaklecia; for (int i=0; i<zaklec; i++){ int a,b; cin>>a>>b; zaklecia.push_back(make_pair(a-1,b-1)); } Twiedza wiedza(medrcow, vector<bool>(zaklec,true)); for (int i=0; i<zaklec; i++){ wiedza[zaklecia[i].first][i]=false; wiedza[zaklecia[i].second][i]=false; } int mind=dni+1; vector <int> wygnancy; for (int m=0; m<medrcow; m++){ int r=wyjdz( wiedza ,m,mind+1); if (r<mind){ wygnancy.clear(); wygnancy.push_back(m+1); mind=r; }else if (r==mind){ wygnancy.push_back(m+1); } } if (mind<=dni){ cout<<mind<<" "<<wygnancy.size()<<endl; copy(begin(wygnancy), end(wygnancy), ostream_iterator<int>(cout," ")); cout<<endl; }else cout<<"-1"<<endl; } return 0; } |