Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 1e4;
- vector<vector<int>> adj;
- int nVertex, nEdge, discCnt;
- vector<bool> visited(0);
- vector<int> low(0);
- vector<int> disc(0);
- set<int> art;
- void DFS(int u, int p){
- visited[u] = true;
- low[u] = disc[u] = ++discCnt;
- int child = 0;
- for(int v : adj[u]){
- if(v == p){
- continue;
- }
- if(visited[v]){
- low[u] = min(low[u], disc[v]);
- } else {
- ++child;
- DFS(v, u);
- low[u] = min(low[u], low[v]);
- if((p == 0 && child > 1) || (p != 0 && low[v] >= disc[u])){
- art.insert(u);
- }
- }
- }
- }
- int main(){
- while(true){
- scanf("%d %d", &nVertex, &nEdge);
- if(nVertex == 0 && nEdge == 0){
- break;
- }
- adj.assign(nVertex + 1, vector<int>(0));
- visited.assign(nVertex + 1, false);
- low.assign(nVertex + 1, 0);
- disc.assign(nVertex + 1, 0);
- art.clear();
- discCnt = 0;
- for(int i = 1; i <= nEdge; ++i){
- int u, v;
- scanf("%d %d", &u, &v);
- adj[u].push_back(v);
- adj[v].push_back(u);
- }
- for(int i = 1; i <= nVertex; ++i){
- if(!visited[i]){
- DFS(i, 0);
- }
- }
- cout << art.size() << "\n";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement