#include<bits/stdc++.h>
using namespace std;
int time1=0;
class Graph {
public:
int V;
list<int> *adj;
public:
Graph(int);
void addedge(int,int);
void printgraph(int);
//void findartpt(int,bool[],int[],map<int,int>,map<int,int>,vector<int>);
void findartpt(int,bool[],int[],int[],int[],bool[]);
};
Graph::Graph(int v) {
this->V=v;
//for(int i=0;i<v;i++)
adj=new list<int>[v];
}
void Graph::addedge(int u,int v) {
adj[v].push_back(u);
adj[u].push_back(v);
}
void Graph::printgraph(int n) {
for(int i=0;i<n;i++) {
for(auto it:adj[i]) {
cout<<it<<" ";
}
cout<<endl;
}
cout<<endl;
}
// void Graph::findartpt(int v,bool visited[],int parent[],map<int,int> lowtime,map<int,int> vistime,vector<int> artpts) {
// visited[v]=false;
// //vistime.push_back();
// lowtime[v]=time1+1;
// vistime[v]=time1+1;
// time1++;
// int child=0;
// bool isartpt=false;
// for(auto it: adj[v]) {
// /*if(parent[v]==it)
// continue;
// else {*/
// if(!visited[it]) {
// child++;
// parent[it]=v;
// findartpt(v,visited,parent,lowtime,vistime,artpts);
// /*if(vistime[v]<=lowtime[it])
// isartpt=true;
// else
// lowtime[v]=min(lowtime[v],lowtime[it]);
// }
// else
// lowtime[v]=min(lowtime[v],vistime[it]);
// }
// }
// if((parent[v]==-1 && child>=2) || (parent[v]!=-1 && isartpt==true))
// artpts.push_back(v);*/
// lowtime[v] = min(lowtime[v], lowtime[it]);
// // u is an articulation point in following cases
// // (1) u is root of DFS tree and has two or more chilren.
// if (parent[v] == -1 && child > 1)
// artpts.push_back(v);
// //ap[u] = true;
// // (2) If u is not root and low value of one of its child is more
// // than discovery value of u.
// if (parent[v] != -1 && lowtime[it] >= vistime[v])
// artpts.push_back(v);
// //ap[u] = true;
// }
// // Update low value of u for parent function calls.
// else if (it != parent[v])
// lowtime[v] = min(lowtime[v], vistime[it]);
// }
// }
void Graph::findartpt(int v,bool visited[],int parent[],int lowtime[],int vistime[],bool artpts[]) {
visited[v]=true;
//vistime.push_back();
lowtime[v]=time1+1;
vistime[v]=time1+1;
time1++;
int child=0;
bool isartpt=false;
for(auto it: adj[v]) {
/*if(parent[v]==it)
continue;
else {*/
if(!visited[it]) {
child++;
parent[it]=v;
findartpt(v,visited,parent,lowtime,vistime,artpts);
/*if(vistime[v]<=lowtime[it])
isartpt=true;
else
lowtime[v]=min(lowtime[v],lowtime[it]);
}
else
lowtime[v]=min(lowtime[v],vistime[it]);
}
}
if((parent[v]==-1 && child>=2) || (parent[v]!=-1 && isartpt==true))
artpts.push_back(v);*/
lowtime[v] = min(lowtime[v], lowtime[it]);
// u is an articulation point in following cases
// (1) u is root of DFS tree and has two or more chilren.
if (parent[v] == -1 && child > 1)
artpts[v] = true;
// (2) If u is not root and low value of one of its child is more
// than discovery value of u.
if (parent[v] != -1 && lowtime[it] >= vistime[v])
artpts[v] = true;
}
// Update low value of u for parent function calls.
else if (it != parent[v])
lowtime[v] = min(lowtime[v], vistime[it]);
}
}
int main() {
int v,v1,v2,e,i;
cout<<"Enter the number of vertices in the graph: "<<endl;
cin>>v;
Graph g(v);
cout<<"Enter the number of edges: "<<endl;
cin>>e;
for(i=0;i<e;i++) {
cin>>v1;
cin>>v2;
g.addedge(v1,v2);
}
//g.printgraph(v);
//map<int,int> vistime,lowtime;
int *vistime=new int[v];
int *lowtime=new int[v];
//int *lowtime[v],*vistime[v];
//vector<int> artpts;
bool *artpts=new bool[v];
int *parent=new int[v];
bool *visited=new bool[v];
for(i=0;i<v;i++) {
visited[i]=false;
parent[i]=-1;
artpts[i]=false;
}
for(i=0;i<v;i++) {
if(visited[i]==false)
g.findartpt(i,visited,parent,lowtime,vistime,artpts);
}
for(i=0;i<v;i++) {
if(artpts[i]==true)
cout<<i<<" ";
}
//for(auto it=artpts.begin();it!=artpts.end();it++)
// cout<<*it<<" ";
cout<<endl;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKaW50IHRpbWUxPTA7CmNsYXNzIEdyYXBoIHsKICAgIHB1YmxpYzoKICAgIGludCBWOwogICAgbGlzdDxpbnQ+ICphZGo7CiAgICBwdWJsaWM6CiAgICBHcmFwaChpbnQpOwogICAgdm9pZCBhZGRlZGdlKGludCxpbnQpOwogICAgdm9pZCBwcmludGdyYXBoKGludCk7CiAgICAvL3ZvaWQgZmluZGFydHB0KGludCxib29sW10saW50W10sbWFwPGludCxpbnQ+LG1hcDxpbnQsaW50Pix2ZWN0b3I8aW50Pik7CiAgICB2b2lkIGZpbmRhcnRwdChpbnQsYm9vbFtdLGludFtdLGludFtdLGludFtdLGJvb2xbXSk7Cgp9OwpHcmFwaDo6R3JhcGgoaW50IHYpICB7CiAgICB0aGlzLT5WPXY7CiAgICAvL2ZvcihpbnQgaT0wO2k8djtpKyspCiAgICBhZGo9bmV3IGxpc3Q8aW50Plt2XTsKfQp2b2lkIEdyYXBoOjphZGRlZGdlKGludCB1LGludCB2KSAgICB7CiAgICBhZGpbdl0ucHVzaF9iYWNrKHUpOwogICAgYWRqW3VdLnB1c2hfYmFjayh2KTsKfQp2b2lkIEdyYXBoOjpwcmludGdyYXBoKGludCBuKSAgICB7CiAgICBmb3IoaW50IGk9MDtpPG47aSsrKSAgICB7CiAgICAgICAgZm9yKGF1dG8gaXQ6YWRqW2ldKSB7CiAgICAgICAgICAgIGNvdXQ8PGl0PDwiICI7CiAgICAgICAgfQogICAgICAgIGNvdXQ8PGVuZGw7CiAgICB9CiAgICBjb3V0PDxlbmRsOwp9Ci8vIHZvaWQgR3JhcGg6OmZpbmRhcnRwdChpbnQgdixib29sIHZpc2l0ZWRbXSxpbnQgcGFyZW50W10sbWFwPGludCxpbnQ+IGxvd3RpbWUsbWFwPGludCxpbnQ+IHZpc3RpbWUsdmVjdG9yPGludD4gYXJ0cHRzKSAgICB7Ci8vICAgICB2aXNpdGVkW3ZdPWZhbHNlOwovLyAgICAgLy92aXN0aW1lLnB1c2hfYmFjaygpOwovLyAgICAgbG93dGltZVt2XT10aW1lMSsxOwovLyAgICAgdmlzdGltZVt2XT10aW1lMSsxOwovLyAgICAgdGltZTErKzsKLy8gICAgIGludCBjaGlsZD0wOwovLyAgICAgYm9vbCBpc2FydHB0PWZhbHNlOwovLyAgICAgZm9yKGF1dG8gaXQ6IGFkalt2XSkgICAgewovLyAgICAgICAgIC8qaWYocGFyZW50W3ZdPT1pdCkKLy8gICAgICAgICAgICAgY29udGludWU7Ci8vICAgICAgICAgZWxzZSAgICB7Ki8KLy8gICAgICAgICAgICAgaWYoIXZpc2l0ZWRbaXRdKSAgICB7Ci8vICAgICAgICAgICAgICAgICBjaGlsZCsrOwovLyAgICAgICAgICAgICAgICAgcGFyZW50W2l0XT12OwovLyAgICAgICAgICAgICAgICAgZmluZGFydHB0KHYsdmlzaXRlZCxwYXJlbnQsbG93dGltZSx2aXN0aW1lLGFydHB0cyk7Ci8vICAgICAgICAgICAgICAgICAvKmlmKHZpc3RpbWVbdl08PWxvd3RpbWVbaXRdKQovLyAgICAgICAgICAgICAgICAgICAgIGlzYXJ0cHQ9dHJ1ZTsKLy8gICAgICAgICAgICAgICAgIGVsc2UgICAgCi8vICAgICAgICAgICAgICAgICAgICAgbG93dGltZVt2XT1taW4obG93dGltZVt2XSxsb3d0aW1lW2l0XSk7Ci8vICAgICAgICAgICAgIH0KLy8gICAgICAgICAgICAgZWxzZSAgICAKLy8gICAgICAgICAgICAgICAgIGxvd3RpbWVbdl09bWluKGxvd3RpbWVbdl0sdmlzdGltZVtpdF0pOwovLyAgICAgICAgIH0KLy8gICAgIH0KLy8gICAgIGlmKChwYXJlbnRbdl09PS0xICYmIGNoaWxkPj0yKSB8fCAocGFyZW50W3ZdIT0tMSAmJiBpc2FydHB0PT10cnVlKSkKLy8gICAgICAgICBhcnRwdHMucHVzaF9iYWNrKHYpOyovCgoKCi8vICAgICAgICAgICAgICAgICBsb3d0aW1lW3ZdICA9IG1pbihsb3d0aW1lW3ZdLCBsb3d0aW1lW2l0XSk7IAogIAovLyAgICAgICAgICAgICAvLyB1IGlzIGFuIGFydGljdWxhdGlvbiBwb2ludCBpbiBmb2xsb3dpbmcgY2FzZXMgCiAgCi8vICAgICAgICAgICAgIC8vICgxKSB1IGlzIHJvb3Qgb2YgREZTIHRyZWUgYW5kIGhhcyB0d28gb3IgbW9yZSBjaGlscmVuLiAKLy8gICAgICAgICAgICAgaWYgKHBhcmVudFt2XSA9PSAtMSAmJiBjaGlsZCA+IDEpIAovLyAgICAgICAgICAgICAgICBhcnRwdHMucHVzaF9iYWNrKHYpOwovLyAgICAgICAgICAgICAgICAvL2FwW3VdID0gdHJ1ZTsgCiAgCi8vICAgICAgICAgICAgIC8vICgyKSBJZiB1IGlzIG5vdCByb290IGFuZCBsb3cgdmFsdWUgb2Ygb25lIG9mIGl0cyBjaGlsZCBpcyBtb3JlIAovLyAgICAgICAgICAgICAvLyB0aGFuIGRpc2NvdmVyeSB2YWx1ZSBvZiB1LiAKLy8gICAgICAgICAgICAgaWYgKHBhcmVudFt2XSAhPSAtMSAmJiBsb3d0aW1lW2l0XSA+PSB2aXN0aW1lW3ZdKSAKLy8gICAgICAgICAgICAgICAgYXJ0cHRzLnB1c2hfYmFjayh2KTsKLy8gICAgICAgICAgICAgICAgLy9hcFt1XSA9IHRydWU7IAovLyAgICAgICAgIH0gCiAgCi8vICAgICAgICAgLy8gVXBkYXRlIGxvdyB2YWx1ZSBvZiB1IGZvciBwYXJlbnQgZnVuY3Rpb24gY2FsbHMuIAovLyAgICAgICAgIGVsc2UgaWYgKGl0ICE9IHBhcmVudFt2XSkgCi8vICAgICAgICAgICAgIGxvd3RpbWVbdl0gID0gbWluKGxvd3RpbWVbdl0sIHZpc3RpbWVbaXRdKTsgCi8vICAgICB9IAovLyB9CnZvaWQgR3JhcGg6OmZpbmRhcnRwdChpbnQgdixib29sIHZpc2l0ZWRbXSxpbnQgcGFyZW50W10saW50IGxvd3RpbWVbXSxpbnQgdmlzdGltZVtdLGJvb2wgYXJ0cHRzW10pICAgIHsKICAgIHZpc2l0ZWRbdl09dHJ1ZTsKICAgIC8vdmlzdGltZS5wdXNoX2JhY2soKTsKICAgIGxvd3RpbWVbdl09dGltZTErMTsKICAgIHZpc3RpbWVbdl09dGltZTErMTsKICAgIHRpbWUxKys7CiAgICBpbnQgY2hpbGQ9MDsKICAgIGJvb2wgaXNhcnRwdD1mYWxzZTsKICAgIGZvcihhdXRvIGl0OiBhZGpbdl0pICAgIHsKICAgICAgICAvKmlmKHBhcmVudFt2XT09aXQpCiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIGVsc2UgICAgeyovCiAgICAgICAgICAgIGlmKCF2aXNpdGVkW2l0XSkgICAgewogICAgICAgICAgICAgICAgY2hpbGQrKzsKICAgICAgICAgICAgICAgIHBhcmVudFtpdF09djsKICAgICAgICAgICAgICAgIGZpbmRhcnRwdCh2LHZpc2l0ZWQscGFyZW50LGxvd3RpbWUsdmlzdGltZSxhcnRwdHMpOwogICAgICAgICAgICAgICAgLyppZih2aXN0aW1lW3ZdPD1sb3d0aW1lW2l0XSkKICAgICAgICAgICAgICAgICAgICBpc2FydHB0PXRydWU7CiAgICAgICAgICAgICAgICBlbHNlICAgIAogICAgICAgICAgICAgICAgICAgIGxvd3RpbWVbdl09bWluKGxvd3RpbWVbdl0sbG93dGltZVtpdF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgICAgCiAgICAgICAgICAgICAgICBsb3d0aW1lW3ZdPW1pbihsb3d0aW1lW3ZdLHZpc3RpbWVbaXRdKTsKICAgICAgICB9CiAgICB9CiAgICBpZigocGFyZW50W3ZdPT0tMSAmJiBjaGlsZD49MikgfHwgKHBhcmVudFt2XSE9LTEgJiYgaXNhcnRwdD09dHJ1ZSkpCiAgICAgICAgYXJ0cHRzLnB1c2hfYmFjayh2KTsqLwoKCgogICAgICAgICAgICAgICAgbG93dGltZVt2XSAgPSBtaW4obG93dGltZVt2XSwgbG93dGltZVtpdF0pOyAKICAKICAgICAgICAgICAgLy8gdSBpcyBhbiBhcnRpY3VsYXRpb24gcG9pbnQgaW4gZm9sbG93aW5nIGNhc2VzIAogIAogICAgICAgICAgICAvLyAoMSkgdSBpcyByb290IG9mIERGUyB0cmVlIGFuZCBoYXMgdHdvIG9yIG1vcmUgY2hpbHJlbi4gCiAgICAgICAgICAgIGlmIChwYXJlbnRbdl0gPT0gLTEgJiYgY2hpbGQgPiAxKSAKICAgICAgICAgICAgICAgYXJ0cHRzW3ZdID0gdHJ1ZTsgCiAgCiAgICAgICAgICAgIC8vICgyKSBJZiB1IGlzIG5vdCByb290IGFuZCBsb3cgdmFsdWUgb2Ygb25lIG9mIGl0cyBjaGlsZCBpcyBtb3JlIAogICAgICAgICAgICAvLyB0aGFuIGRpc2NvdmVyeSB2YWx1ZSBvZiB1LiAKICAgICAgICAgICAgaWYgKHBhcmVudFt2XSAhPSAtMSAmJiBsb3d0aW1lW2l0XSA+PSB2aXN0aW1lW3ZdKSAKICAgICAgICAgICAgICAgYXJ0cHRzW3ZdID0gdHJ1ZTsgCiAgICAgICAgfSAKICAKICAgICAgICAvLyBVcGRhdGUgbG93IHZhbHVlIG9mIHUgZm9yIHBhcmVudCBmdW5jdGlvbiBjYWxscy4gCiAgICAgICAgZWxzZSBpZiAoaXQgIT0gcGFyZW50W3ZdKSAKICAgICAgICAgICAgbG93dGltZVt2XSAgPSBtaW4obG93dGltZVt2XSwgdmlzdGltZVtpdF0pOyAKICAgIH0gCn0KCmludCBtYWluKCkgIHsKICAgIGludCB2LHYxLHYyLGUsaTsKICAgIGNvdXQ8PCJFbnRlciB0aGUgbnVtYmVyIG9mIHZlcnRpY2VzIGluIHRoZSBncmFwaDogIjw8ZW5kbDsKICAgIGNpbj4+djsKICAgIEdyYXBoIGcodik7CiAgICBjb3V0PDwiRW50ZXIgdGhlIG51bWJlciBvZiBlZGdlczogIjw8ZW5kbDsKICAgIGNpbj4+ZTsKICAgIGZvcihpPTA7aTxlO2krKykgICAgewogICAgICAgIGNpbj4+djE7CiAgICAgICAgY2luPj52MjsKICAgICAgICBnLmFkZGVkZ2UodjEsdjIpOwogICAgfQogICAgLy9nLnByaW50Z3JhcGgodik7CiAgICAvL21hcDxpbnQsaW50PiB2aXN0aW1lLGxvd3RpbWU7CiAgICBpbnQgKnZpc3RpbWU9bmV3IGludFt2XTsKICAgIGludCAqbG93dGltZT1uZXcgaW50W3ZdOwogICAgLy9pbnQgKmxvd3RpbWVbdl0sKnZpc3RpbWVbdl07CiAgICAvL3ZlY3RvcjxpbnQ+IGFydHB0czsKICAgIGJvb2wgKmFydHB0cz1uZXcgYm9vbFt2XTsKICAgIGludCAqcGFyZW50PW5ldyBpbnRbdl07CiAgICBib29sICp2aXNpdGVkPW5ldyBib29sW3ZdOwogICAgZm9yKGk9MDtpPHY7aSsrKSAgICB7CiAgICAgICAgdmlzaXRlZFtpXT1mYWxzZTsKICAgICAgICBwYXJlbnRbaV09LTE7CiAgICAgICAgYXJ0cHRzW2ldPWZhbHNlOwogICAgfQogICAgZm9yKGk9MDtpPHY7aSsrKSAgICB7CiAgICAgICAgaWYodmlzaXRlZFtpXT09ZmFsc2UpCiAgICAgICAgICAgZy5maW5kYXJ0cHQoaSx2aXNpdGVkLHBhcmVudCxsb3d0aW1lLHZpc3RpbWUsYXJ0cHRzKTsKICAgIH0KICAgIGZvcihpPTA7aTx2O2krKykgICAgewogICAgICAgIGlmKGFydHB0c1tpXT09dHJ1ZSkKICAgICAgICAgICBjb3V0PDxpPDwiICI7CiAgICB9CiAgICAvL2ZvcihhdXRvIGl0PWFydHB0cy5iZWdpbigpO2l0IT1hcnRwdHMuZW5kKCk7aXQrKykKICAgIC8vICAgIGNvdXQ8PCppdDw8IiAiOwogICAgY291dDw8ZW5kbDsKfQ==