#include <bits/stdc++.h> #include "message.h" #include "sabotaz.h" using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef vector <int> VI; const int INF = 1000000000; int n, m, cnt, odp; VI in, pi; vector <VI> adj; void read(){ int i, a, b; scanf("%d %d", &n, &m); n = NumberOfIsles(); m = NumberOfBridges(); adj.clear(); adj.resize(n); for (i = 0; i < m; ++i){ a = BridgeEndA(i); b = BridgeEndB(i); if (a == b) continue; adj[a].push_back(b); adj[b].push_back(a); } } void init(){ in.clear(); in.resize(n,INF); pi.resize(n); cnt = 1; } int dfs(int u){ int ans = u; in[u] = cnt++; for (int i = 0; i < adj[u].size(); i++){ int v = adj[u][i]; if (v == u) continue; if (v == pi[u]) continue; if (in[v]==INF){ pi[v] = u; v = dfs(v); } if (in[ans] > in[v]) ans = v; } if (ans == u && pi[u] != u) odp++; return ans; } int main(void){ read(); init(); for (int u = 0; u < n; u++) if (in[u] == INF){ pi[u] = u; dfs(u); } if (MyNodeId() == 0) cout << odp << endl; }
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 | #include <bits/stdc++.h> #include "message.h" #include "sabotaz.h" using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef vector <int> VI; const int INF = 1000000000; int n, m, cnt, odp; VI in, pi; vector <VI> adj; void read(){ int i, a, b; scanf("%d %d", &n, &m); n = NumberOfIsles(); m = NumberOfBridges(); adj.clear(); adj.resize(n); for (i = 0; i < m; ++i){ a = BridgeEndA(i); b = BridgeEndB(i); if (a == b) continue; adj[a].push_back(b); adj[b].push_back(a); } } void init(){ in.clear(); in.resize(n,INF); pi.resize(n); cnt = 1; } int dfs(int u){ int ans = u; in[u] = cnt++; for (int i = 0; i < adj[u].size(); i++){ int v = adj[u][i]; if (v == u) continue; if (v == pi[u]) continue; if (in[v]==INF){ pi[v] = u; v = dfs(v); } if (in[ans] > in[v]) ans = v; } if (ans == u && pi[u] != u) odp++; return ans; } int main(void){ read(); init(); for (int u = 0; u < n; u++) if (in[u] == INF){ pi[u] = u; dfs(u); } if (MyNodeId() == 0) cout << odp << endl; } |