【菜鸡的DailyTopic】图的割点 / 图的割边(桥)模板

算法讲解: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;
}

 

你可能感兴趣的:(DailyTopic,模板)