#include #include #include #include using namespace std;

void dfs1(vector<vector>& graph, int node, vector& visited, stack& st) { visited[node] = true; for (int neighbor : graph[node]) { if (!visited[neighbor]) { dfs1(graph, neighbor, visited, st); } } st.push(node); }

void dfs2(vector<vector>& graph, int node, vector& visited) { visited[node] = true; for (int neighbor : graph[node]) { if (!visited[neighbor]) { dfs2(graph, neighbor, visited); } } }

bool kosaraju(vector<vector>& graph) { int n = graph.size(); vector visited(n, false); stack st; for (int i = 0; i < n; i++) { if (!visited[i]) { dfs1(graph, i, visited, st); } }

vector<vector<int>> transpose(n);
for (int i = 0; i < n; i++) {
    for (int neighbor : graph[i]) {
        transpose[neighbor].push_back(i);
    }
}

fill(visited.begin(), visited.end(), false);
int num_scc = 0;
while (!st.empty()) {
    int node = st.top();
    st.pop();
    if (!visited[node]) {
        dfs2(transpose, node, visited);
        num_scc++;
    }
    if (num_scc >= 2) {
        return false;
    }
}
return true;

}

int main() { int n, m; while (cin >> n >> m && (n != 0 || m != 0)) { vector<vector> graph(n); for (int i = 0; i < m; i++) { int u, v; int op; cin >> u >> v >> op; if (op == 1) { graph[u - 1].push_back(v - 1); } else { graph[u - 1].push_back(v - 1); graph[v - 1].push_back(u - 1); } } bool result = kosaraju(graph); cout << (result ? 1 : 0) << endl; } return 0; }

改为Kosaraju求SSC#includealgorithm#includeiostream#includecstring#includecstdio#includecmathusing namespace std;const int MAXN=2e3+5MAXM=MAXNMAXN;int nmtotheadMAXN;struct Edge	int tonxt;	Edge to=nxt=0;

原文地址: http://www.cveoy.top/t/topic/i7rR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录