题意:就要给你一个图,求有多少个割点
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
const int maxn=10010;
const int maxm=100010;
vector<int>G[105];
int low[105],dfn[105],cut[105],cont=1,ans=0;
void dfs(int fa,int x)
{
int son=0;
dfn[x]=low[x]=cont++;
int len=G[x].size();
for(int i=0; i<len; i++)
{
int nex=G[x][i];
if(nex==fa)continue;
if(!dfn[nex])
{
son++;
dfs(x,nex);
low[x]=min(low[x],low[nex]);
if(low[nex]>=dfn[x]&&fa!=-1&&!cut[x])
{
cut[x]=1;
ans++;
}
}
else low[x]=min(low[x],dfn[nex]);
}
if(fa==-1&&son>1)
{
cut[x]=1;
ans++;
}
}
void init(void)
{
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(cut,0,sizeof(cut));
cont=1; ans=0;
}
int main()
{
int n,x,y;
char ch;
while(~scanf("%d",&n)&&n)
{
init();
while(~scanf("%d",&x)&&x)
while((ch=getchar())!='\n')
{
scanf("%d",&y);
G[x].push_back(y);
G[y].push_back(x);
}
for(int i=1; i<=n; i++)
if(!dfn[i])dfs(-1,i);
printf("%d\n",ans);
for(int i=1; i<=n; i++)
G[i].clear();
}
return 0;
}
传送门
int low[20005],dfn[20005],cut[20005],cont,ans;
vector<int>G[20005];
vector<pair<int,int> >bri;
void dfs(int fa,int x)
{
int son=0;
dfn[x]=low[x]=cont++;
int len=G[x].size();
for(int i=0; i<len; i++)
{
int nex=G[x][i];
if(nex==fa)continue;
if(!dfn[nex])
{
son++;
dfs(x,nex);
low[x]=min(low[x],low[nex]);
if(low[nex]>dfn[x]) //桥
if(nex>x)bri.push_back(make_pair(x,nex));
else bri.push_back(make_pair(nex,x));
if(low[nex]>=dfn[x]&&fa!=-1&&!cut[x]) //割点
{
ans++;
cut[x]=1;
}
}
else low[x]=min(low[x],dfn[nex]);
}
if(fa==-1&&son>1) //根节点割点判定
{
cut[x]=1;
ans++;
}
}
void init(void)
{
bri.clear();
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
cont=1;
ans=0;
}
int main()
{
int n,m,x,y;
init();
scanf("%d%d",&n,&m);
for(int i=0; i<m; i++)
{
scanf("%d%d",&x,&y);
G[x].push_back(y);
G[y].push_back(x);
}
for(int i=1; i<=n; i++)
if(!dfn[i])dfs(-1,i);
sort(bri.begin(),bri.end());
bool flag=false;
if(ans==0)printf("Null\n");
else
for(int i=1; i<=n; i++)
if(cut[i])
{
if(flag)printf(" ");
printf("%d",i);
flag=true;
}
printf("\n");
int len=bri.size();
for(int i=0; i<len; i++)
printf("%d %d\n",bri[i].first,bri[i].second);
return 0;
}