算法讲解:ahsf P229 链接:https://pan.baidu.com/s/1r-tbk_TCMrpk_tclb-X4vA 提取码:mp5m
图的割点 算法模板:
// 图的割点
#include
using namespace std;
const int ml = 256;
int n,root,index;
int num[ml],low[ml];
bool flag[ml];
vector< int> vec[ml];
void dfs(int cur,int f)
{
int child=0;
index++;
num[cur] = index;
low[cur] = index; // 当然可以回到自己
for(int i=0;i= num[cur]) //不靠爹就找不到祖先
flag[cur] = true; //是割点
if(cur == root && child == 2) // 注意这里
flag[cur] = true;
}
else if(t != f)
low[cur] = min(low[cur],low[t]);
}
}
int main()
{
int m;
scanf("%d%d",&n,&m); //点,边
int u,v;
for(int i=1;i<=m;i++) {
scanf("%d%d",&u,&v);
vec[u].push_back(v);
vec[v].push_back(u);
}
memset(flag,false,sizeof flag);
memset(num,0,sizeof num);
memset(low,0x3f3f3f3f,sizeof low);
index = 0;
root = 1;
dfs(1,0);
printf("割点为: ");
for(int i=1;i<=n;i++)
if(flag[i]) printf("%d ",i);
return 0;
}
图的割点 习题:
POJ - 1523 SPF https://blog.csdn.net/weixin_42765557/article/details/98753788
图的割边 算法模板:
// 图的割点
#include
using namespace std;
const int ml = 256;
int n,root,index;
int num[ml],low[ml];
bool flag[ml];
vector< int> vec[ml];
void dfs(int cur,int f)
{
index++;
num[cur] = index;
low[cur] = index; // 当然可以回到自己
for(int i=0;i num[cur]) //不靠爹就找不到祖先
printf("%d - %d\n",cur,t);
}
else if(t != f)
low[cur] = min(low[cur],low[t]);
}
}
int main()
{
int m;
scanf("%d%d",&n,&m); //点,边
int u,v;
for(int i=1;i<=m;i++) {
scanf("%d%d",&u,&v);
vec[u].push_back(v);
vec[v].push_back(u);
}
memset(flag,false,sizeof flag);
memset(num,0,sizeof num);
memset(low,0x3f3f3f3f,sizeof low);
index = 0;
root = 1;
printf("割边为:");
dfs(1,0);
return 0;
}