Advertisement
mickypinata

SPOJ: Submerging Islands

Nov 27th, 2020
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.42 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 1e4;
  5.  
  6. vector<vector<int>> adj;
  7. int nVertex, nEdge, discCnt;
  8.  
  9. vector<bool> visited(0);
  10. vector<int> low(0);
  11. vector<int> disc(0);
  12. set<int> art;
  13. void DFS(int u, int p){
  14.     visited[u] = true;
  15.     low[u] = disc[u] = ++discCnt;
  16.     int child = 0;
  17.     for(int v : adj[u]){
  18.         if(v == p){
  19.             continue;
  20.         }
  21.         if(visited[v]){
  22.             low[u] = min(low[u], disc[v]);
  23.         } else {
  24.             ++child;
  25.             DFS(v, u);
  26.             low[u] = min(low[u], low[v]);
  27.             if((p == 0 && child > 1) || (p != 0 && low[v] >= disc[u])){
  28.                 art.insert(u);
  29.             }
  30.         }
  31.     }
  32. }
  33.  
  34. int main(){
  35.  
  36.     while(true){
  37.         scanf("%d %d", &nVertex, &nEdge);
  38.         if(nVertex == 0 && nEdge == 0){
  39.             break;
  40.         }
  41.         adj.assign(nVertex + 1, vector<int>(0));
  42.         visited.assign(nVertex + 1, false);
  43.         low.assign(nVertex + 1, 0);
  44.         disc.assign(nVertex + 1, 0);
  45.         art.clear();
  46.         discCnt = 0;
  47.         for(int i = 1; i <= nEdge; ++i){
  48.             int u, v;
  49.             scanf("%d %d", &u, &v);
  50.             adj[u].push_back(v);
  51.             adj[v].push_back(u);
  52.         }
  53.         for(int i = 1; i <= nVertex; ++i){
  54.             if(!visited[i]){
  55.                 DFS(i, 0);
  56.             }
  57.         }
  58.         cout << art.size() << "\n";
  59.     }
  60.  
  61.     return 0;
  62. }
  63.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement