Cod sursa(job #3231108)

Utilizator LeventAmet Levent Levent Data 24 mai 2024 20:44:46
Problema Party Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.1 kb
#include <bits/stdc++.h>

using namespace std;

void DFS(int u, vector<vector<int>>& graph, vector<bool>& visited, stack<int>& finished) {
    visited[u] = true;
    for (int v : graph[u]) {
        if (!visited[v]) {
            DFS(v, graph, visited, finished);
        }
    }
    finished.push(u); // Adăugăm nodul în stivă când am terminat de explorat vecinii săi
}

vector<int> topologicalSort(int n, vector<vector<int>>& graph) {
    vector<bool> visited(n + 1, false);
    stack<int> finished; // Stiva pentru a reține nodurile în ordinea încheierii parcurgerii DFS

    // Parcurgem toate nodurile și aplicăm DFS pentru nodurile nevizitate
    for (int i = 1; i <= n; ++i) {
        if (!visited[i]) {
            DFS(i, graph, visited, finished);
        }
    }

    // Construim rezultatul din stivă (nodurile sunt acum în ordinea inversă a terminării DFS)
    vector<int> result;
    while (!finished.empty()) {
        result.push_back(finished.top());
        finished.pop();
    }

    return result;
}
    
int main() {
    ifstream fin("scandal.in");
    ofstream fout("scandal.out");

    int n, m;
    fin>>n>>m;

    vector<vector<int>> graph(2*n+1);

    for(int i=0; i<m; i++) {
        int u, v, c;
        fin>>u>>v>>c;

        if(c==0) {
            graph[n+u].push_back(v);
            graph[n+v].push_back(u);
        } else if(c==1) {
            graph[n+u].push_back(n+v);
            graph[v].push_back(n+u);
        } else if(c==2) {
            graph[n+v].push_back(n+u);
            graph[u].push_back(v);
        } else {
            graph[u].push_back(n+v);
            graph[v].push_back(n+u);
        }

    }

    vector<int> topSort = topologicalSort(2*n, graph);

    int cond=1;

    for(unsigned int i=topSort.size()-1; i>=0; i--) {
        if(topSort[i]<=n)
            fout<<topSort[i]<<" ";
        else {
            for(int j=topSort.size(); j>i; j--) {
                if(topSort[j]<=n)
                    if(topSort[i]-n==topSort[j])
                        cond = 0;
            }
        }
        if(cond==0)
            break;
        }
            
    fout<<endl;

    return 0;
}