Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <map>
- #include <vector>
- #include <math.h>
- #define INF 900000000
- using namespace std;
- void dfs1(map<string, vector<string>>* g, map<string, int>* color, vector<string>* order, string curr){
- (*color)[curr] = 1;
- for (int i = 0; i < (*g)[curr].size(); i++){
- string to = (*g)[curr][i];
- if ((*color)[to] == 0){
- dfs1(g, color, order, to);
- }
- }
- (*order).push_back(curr);
- (*color)[curr] = 2;
- }
- void dfs2(map<string, vector<string>>* g, map<string, int>* component, int componentNo, string curr){
- (*component)[curr] = componentNo;
- for (int i = 0; i < (*g)[curr].size(); i++){
- string to = (*g)[curr][i];
- if ((*component)[to] == -1){
- dfs2(g, component, componentNo, to);
- }
- }
- }
- int main(){
- int n, m;
- cin >> n >> m;
- map<string, vector<string>> graph;
- map<string, vector<string>> reversedGraph;
- map<string, int> components;
- map<string, int> color;
- vector<string> guests;
- vector<string> order;
- for (int i = 0; i < n; i++){
- string s;
- cin >> s;
- guests.push_back(s);
- graph['-' + s] = vector<string>(0);
- graph['+' + s] = vector<string>(0);
- reversedGraph['-' + s] = vector<string>(0);
- reversedGraph['+' + s] = vector<string>(0);
- color['-' + s] = 0;
- color['+' + s] = 0;
- components['-' + s] = -1;
- components['+' + s] = -1;
- }
- for (int i = 0; i < m; i++){
- string from, to;
- cin >> from >> to >> to;
- graph[from].push_back(to);
- reversedGraph[to].push_back(from);
- if (from[0] == '-')
- from[0] = '+';
- else
- from[0] = '-';
- if (to[0] == '-')
- to[0] = '+';
- else
- to[0] = '-';
- graph[from].push_back(to);
- reversedGraph[to].push_back(from);
- }
- for (int i = 0; i < n; i++){
- if (color['-' + guests[i]] == 0){
- dfs1(&graph, &color, &order, '-' + guests[i]);
- }
- if (color['+' + guests[i]] == 0){
- dfs1(&graph, &color, &order, '+' + guests[i]);
- }
- }
- int cmp = 0;
- for (int i = 0; i < order.size(); i++){
- string vert = order[order.size() - 1 - i];
- if (components[vert] == -1){
- cmp++;
- dfs2(&reversedGraph, &components, cmp, vert);
- }
- }
- bool isCycle = false;
- vector<string> answer;
- for (int i = 0; i < guests.size(); i++){
- if (components['-' + guests[i]] == components['+' + guests[i]]){
- isCycle = true;
- break;
- }
- else{
- if (components['+' + guests[i]] < components['-' + guests[i]]){
- answer.push_back(guests[i]);
- }
- }
- // cout << endl;
- // cout << '-' + guests[i] << " " << components['-' + guests[i]] << endl;
- // cout << '+' + guests[i] << " " << components['+' + guests[i]] << endl;
- // cout << endl;
- }
- if (!isCycle && answer.size() != 0){
- cout << answer.size() << endl;
- for (int i = 0; i < answer.size(); i++){
- cout << answer[i] << endl;
- }
- }
- else{
- cout << -1;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement