Pagini recente » Cod sursa (job #430912) | Cod sursa (job #256542) | Cod sursa (job #1698485) | Cod sursa (job #1019724) | Cod sursa (job #3231108)
#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;
}