求割点
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define ll long long
#define maxn 100009
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ll)(ch-'0');ch=getchar();}
return x*f;
}
int head[maxn],dfn[maxn],low[maxn],point[maxn];
int n,m,k,ans,cnt,id,tot,root;
struct edge
{
int to,nxt;
}p[maxn<<1];
void add(int x,int y)
{
++cnt,p[cnt].to=y,p[cnt].nxt=head[x],head[x]=cnt;
}
void Tarjan(int u,int fa)
{
dfn[u]=low[u]=++id;
int child=0;
for(int i=head[u];i;i=p[i].nxt)
{
int v=p[i].to;
if(!dfn[v])
{
Tarjan(v,u);
low[u]=min(low[u],low[v]);
if(u!=root&&low[v]>=dfn[u])
point[u]=1;
if(u==root&&++child>=2)
point[u]=1;
}
else
low[u]=min(low[u],dfn[v]);
}
}
int main()
{
n=read(),m=read();
for(int i=1;i<=m;i++)
{
int x=read(),y=read();
add(x,y),add(y,x);
}
for(int i=1;i<=n;i++)
if(!dfn[i])
root=i,Tarjan(i,i);
for(int i=1;i<=n;i++)
if(point[i])
tot++;
printf("%d\n",tot);
for(int i=1;i<=n;i++)
if(point[i])
printf("%d ",i);
fclose(stdin);
fclose(stdout);
return 0;
}
求割边
#include<bits/stdc++.h>
using namespace std;
#define re register int
#define ll long long
#define INF 0x3f3f3f3f
#define maxn 50005
#define maxm 500005
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ll)(ch-'0');ch=getchar();}
return x*f;
}
priority_queue<pair<int,int> >q;
int head[maxn],dfn[maxn],low[maxn];
bool vis[maxm<<1];
int n,m,k,ans,tot,id,cnt=1;
struct edge
{
int to,nxt;
}p[maxm<<1];
void add(int x,int y)
{
p[++cnt]={y,head[x]},head[x]=cnt;
}
void Tarjan(int u)
{
dfn[u]=low[u]=++id;
for(int i=head[u];i;i=p[i].nxt)
{
if(vis[i^1])
continue;
int v=p[i].to;
vis[i]=1;
if(!dfn[v])
{
Tarjan(v);
low[u]=min(low[u],low[v]);
if(dfn[u]<low[v])
q.push(make_pair(-min(u,v),-max(u,v)));
}
else
low[u]=min(low[u],dfn[v]);
}
}
int main()
{
n=read(),m=read();
for(int i=1;i<=m;i++)
{
int x=read(),y=read();
add(x,y),add(y,x);
}
for(int i=1;i<=n;i++)
if(!dfn[i])
Tarjan(i);
while(q.size())
{
printf("%d %d\n",-q.top().first,-q.top().second);
q.pop();
}
fclose(stdin);
fclose(stdout);
return 0;
}