#include <iostream>
#include <vector>
#include <set>
using namespace std;
typedef struct Vertex{
int id;
set<int> outgoing;
set<int> incoming;
bool removed;
}Vertex;
typedef vector<Vertex> Graph;
void init_graph(Graph & g, int n){
for(int i=0; i<n;i++){
Vertex v1;
v1.id = i;
v1.removed = false;
g.push_back(v1);
}
}
void eliminate(Graph &graph, int n, Graph &enemy_graph){
unsigned int max_out=0,min_in=0xffffffff;
int to_remove=-1;
for(int i=0; i<n; i++){
if(graph[i].removed) continue;
if(max_out<graph[i].outgoing.size())
max_out = graph[i].outgoing.size();
}
for(int i=0; i<n; i++){
if(graph[i].removed || graph[i].outgoing.size()<max_out) continue;
if(min_in>graph[i].incoming.size()){
min_in = graph[i].incoming.size();
to_remove=i;
}
}
graph[to_remove].removed=true;
for(set<int>::iterator it = graph[to_remove].incoming.begin(); it != graph[to_remove].incoming.end();++it){
enemy_graph[*it].outgoing.erase(to_remove);
}
for(set<int>::iterator it = graph[to_remove].outgoing.begin(); it != graph[to_remove].outgoing.end();++it){
enemy_graph[*it].incoming.erase(to_remove);
}
}
int test(){
int n,m,a,b;
char c;
cin>>n>>m;
Graph bajtek, bitek;
init_graph(bajtek,n);
init_graph(bitek,n);
for(int i = 0; i < m ; i++){
cin>>a>>c>>b;
a--;b--;
if(c == '<'){
bajtek[a].incoming.insert(b);
bitek[b].outgoing.insert(a);
} else {
bajtek[a].outgoing.insert(b);
bitek[b].incoming.insert(a);
}
}
for(int i=0; i < n-1 ; i++){
eliminate(bitek,n,bajtek);
eliminate(bajtek,n,bitek);
}
for(Graph::iterator it = bajtek.begin(); it != bajtek.end();++it){
if(it->removed)continue;
for(Graph::iterator itt = bitek.begin(); itt != bitek.end();++itt){
if(itt->removed)continue;
if(it->outgoing.count(itt->id)==1)return 1;
if(it->incoming.count(itt->id)==1)return -1;
else return 0;
}
}
return 0;
}
int main(){
#ifndef HESOYAM
ios_base::sync_with_stdio(false);
cin.tie(NULL);
#endif
int T;
cin>>T;
while(T-->0){
int ans = test();
switch(ans){
case 1:
cout<<"WYGRANA\n";
break;
case 0:
cout<<"REMIS\n";
break;
case -1:
cout<<"PRZEGRANA\n";
break;
default:
break;
};
}
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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | #include <iostream> #include <vector> #include <set> using namespace std; typedef struct Vertex{ int id; set<int> outgoing; set<int> incoming; bool removed; }Vertex; typedef vector<Vertex> Graph; void init_graph(Graph & g, int n){ for(int i=0; i<n;i++){ Vertex v1; v1.id = i; v1.removed = false; g.push_back(v1); } } void eliminate(Graph &graph, int n, Graph &enemy_graph){ unsigned int max_out=0,min_in=0xffffffff; int to_remove=-1; for(int i=0; i<n; i++){ if(graph[i].removed) continue; if(max_out<graph[i].outgoing.size()) max_out = graph[i].outgoing.size(); } for(int i=0; i<n; i++){ if(graph[i].removed || graph[i].outgoing.size()<max_out) continue; if(min_in>graph[i].incoming.size()){ min_in = graph[i].incoming.size(); to_remove=i; } } graph[to_remove].removed=true; for(set<int>::iterator it = graph[to_remove].incoming.begin(); it != graph[to_remove].incoming.end();++it){ enemy_graph[*it].outgoing.erase(to_remove); } for(set<int>::iterator it = graph[to_remove].outgoing.begin(); it != graph[to_remove].outgoing.end();++it){ enemy_graph[*it].incoming.erase(to_remove); } } int test(){ int n,m,a,b; char c; cin>>n>>m; Graph bajtek, bitek; init_graph(bajtek,n); init_graph(bitek,n); for(int i = 0; i < m ; i++){ cin>>a>>c>>b; a--;b--; if(c == '<'){ bajtek[a].incoming.insert(b); bitek[b].outgoing.insert(a); } else { bajtek[a].outgoing.insert(b); bitek[b].incoming.insert(a); } } for(int i=0; i < n-1 ; i++){ eliminate(bitek,n,bajtek); eliminate(bajtek,n,bitek); } for(Graph::iterator it = bajtek.begin(); it != bajtek.end();++it){ if(it->removed)continue; for(Graph::iterator itt = bitek.begin(); itt != bitek.end();++itt){ if(itt->removed)continue; if(it->outgoing.count(itt->id)==1)return 1; if(it->incoming.count(itt->id)==1)return -1; else return 0; } } return 0; } int main(){ #ifndef HESOYAM ios_base::sync_with_stdio(false); cin.tie(NULL); #endif int T; cin>>T; while(T-->0){ int ans = test(); switch(ans){ case 1: cout<<"WYGRANA\n"; break; case 0: cout<<"REMIS\n"; break; case -1: cout<<"PRZEGRANA\n"; break; default: break; }; } return 0; } |
English