#include "message.h" #include "sabotaz.h" #include <bits/stdc++.h> #include <assert.h> #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define FORD(i, a, b) for(int i = (a); i >= (b); --i) #define VAR(v, i) __typeof(i) v=(i) #define FORE(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i) #define all(v) (v).begin(),(v).end() #define VI vector<int> #define PII pair<int,int> #define st first #define nd second #define mp make_pair #define pb push_back #define lint long long int #define debug(x) {cerr <<#x <<" = " <<x <<endl; } #define debug2(x,y) {cerr <<#x <<" = " <<x << ", "<<#y<<" = "<< y <<endl; } #define debug3(x,y,z) {cerr <<#x <<" = " <<x << ", "<<#y<<" = "<< y << ", " << #z << " = " << z <<endl; } #define debugv(x) {{cerr <<#x <<" = "; FORE(itt, (x)) cerr <<*itt <<", "; cerr <<endl; }} #define debugt(t,n) {{cerr <<#t <<" = "; FOR(it,0,(n)) cerr <<t[it] <<", "; cerr <<endl; }} using namespace std; int n,m; set<int> g[200005]; int in[200005]; int pi[200005]; set<PII> podwojne; vector<PII> mosty; int cnt = 1; int dfs(int u) { int ans = u; in[u] = cnt++; FORE(i,g[u]){ int v = *i; if (v == pi[u]) continue; if (in[v] == 1e9) { pi[v] = u; v = dfs(v); } if (in[ans] > in[v]) ans = v; } if (ans == u && pi[u]!=u) { mosty.pb(mp(u,pi[u])); } return ans; } int main() { int myId = MyNodeId(); n = NumberOfIsles(); m = NumberOfBridges(); if (myId == 0) { int ans = 0; FOR(i,0,m) { int u = BridgeEndA(i), v = BridgeEndB(i); if (u != v) { if(g[v].find(u) != g[v].end()) podwojne.insert(mp(v,u)); else { g[v].insert(u); g[u].insert(v); } } } FOR(i,0,n) in[i] = 1e9; FOR(i,0,n) { if(in[i] == 1e9){ pi[i] = i; dfs(i); } } FOR(i,0,mosty.size()) { if(podwojne.find(mosty[i]) == podwojne.end()) { PII xx = mp(mosty[i].nd, mosty[i].st); if(podwojne.find(xx) == podwojne.end()) { ans++; } } } printf("%d\n",ans); } }
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 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | #include "message.h" #include "sabotaz.h" #include <bits/stdc++.h> #include <assert.h> #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define FORD(i, a, b) for(int i = (a); i >= (b); --i) #define VAR(v, i) __typeof(i) v=(i) #define FORE(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i) #define all(v) (v).begin(),(v).end() #define VI vector<int> #define PII pair<int,int> #define st first #define nd second #define mp make_pair #define pb push_back #define lint long long int #define debug(x) {cerr <<#x <<" = " <<x <<endl; } #define debug2(x,y) {cerr <<#x <<" = " <<x << ", "<<#y<<" = "<< y <<endl; } #define debug3(x,y,z) {cerr <<#x <<" = " <<x << ", "<<#y<<" = "<< y << ", " << #z << " = " << z <<endl; } #define debugv(x) {{cerr <<#x <<" = "; FORE(itt, (x)) cerr <<*itt <<", "; cerr <<endl; }} #define debugt(t,n) {{cerr <<#t <<" = "; FOR(it,0,(n)) cerr <<t[it] <<", "; cerr <<endl; }} using namespace std; int n,m; set<int> g[200005]; int in[200005]; int pi[200005]; set<PII> podwojne; vector<PII> mosty; int cnt = 1; int dfs(int u) { int ans = u; in[u] = cnt++; FORE(i,g[u]){ int v = *i; if (v == pi[u]) continue; if (in[v] == 1e9) { pi[v] = u; v = dfs(v); } if (in[ans] > in[v]) ans = v; } if (ans == u && pi[u]!=u) { mosty.pb(mp(u,pi[u])); } return ans; } int main() { int myId = MyNodeId(); n = NumberOfIsles(); m = NumberOfBridges(); if (myId == 0) { int ans = 0; FOR(i,0,m) { int u = BridgeEndA(i), v = BridgeEndB(i); if (u != v) { if(g[v].find(u) != g[v].end()) podwojne.insert(mp(v,u)); else { g[v].insert(u); g[u].insert(v); } } } FOR(i,0,n) in[i] = 1e9; FOR(i,0,n) { if(in[i] == 1e9){ pi[i] = i; dfs(i); } } FOR(i,0,mosty.size()) { if(podwojne.find(mosty[i]) == podwojne.end()) { PII xx = mp(mosty[i].nd, mosty[i].st); if(podwojne.find(xx) == podwojne.end()) { ans++; } } } printf("%d\n",ans); } } |