当前位置:首页 > 芯闻号 > 充电吧
[导读]题目:求一个连通图的割点,割点的定义是,如果除去此节点和与其相关的边,图不再连通,描述算法。分析:1. 最简单也是最直接的算法是,删除一个点然后判断连通性,如果删除此点,图不再连通,则此点是割点,反之

题目:求一个连通图的割点,割点的定义是,如果除去此节点和与其相关的边,图不再连通,描述算法。

分析:

1. 最简单也是最直接的算法是,删除一个点然后判断连通性,如果删除此点,图不再连通,则此点是割点,反之不是割点(图的连通性一般通过深搜来判定,是否能一次搜索完 全部顶点);

2. 通过深搜优先生成树来判定。从任一点出发深度优先遍历得到优先生成树,对于树中任一顶点V而言,其孩子节点为邻接点。由深度优先生成树可得出两类割点的特性:

     (1)若生成树的根有两棵或两棵以上的子树,则此根顶点必为割点。因为图中不存在连接不同子树顶点的边,若删除此节点,则树便成为森林;

     (2)若生成树中某个非叶子顶点V,其某棵子树的根和子树中的其他节点均没有指向V的祖先的回边,则V为割点。因为删去v,则其子树和图的其它部分被分割开来。

仍然利用深搜算法,只不过在这里定义visited[v]表示为深度优先搜索遍历图时访问顶点v的次序号,定义low[v]=Min{visited[v],low[w],visited[k]},其中w是顶点v在深度优先生成树上的孩子节点;k是顶点v在深度优先生成树上由回边联结的祖先节点。

   割点判定条件:如果对于某个顶点v,存在孩子节点w且low[w]>=visited[v],则该顶点v必为关节点。因为当w是v的孩子节点时,low[w]>=visited[v],表明w及其子孙均无指向v的祖先的回边,那么当删除顶点v后,v的孩子节点将于其他节点被分割开来,从来形成新的连通分量。

#include#includeusing namespace std;

#define MAX_VERTEX_NUM 13

//邻接表存储结构
typedef struct ArcNode{
	int adjvex;
	ArcNode *nextarc;
}ArcNode;

typedef struct VNode{
	string data;
	ArcNode* firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];

typedef struct{
	AdjList vertices;
	int vexnum, arcnum;
}ALGraph;

//返回u在图中的位置
int LocateVex(ALGraph G, string u)
{
	for(int i=0; i<G.vexnum; i++)
		if(G.vertices[i].data==u)
			return i;
	return -1;
}

//构造图
void CreateDG(ALGraph &G)
{
	string v1, v2;
	int i, j, k;
	cout<>G.vexnum>>G.arcnum;

	cout<<"请输入顶点:";
	for(i=0; i>G.vertices[i].data;
		G.vertices[i].firstarc=NULL;
	}

	cout<<"请输入边:"<<endl;
	for(k=0; k>v1>>v2;
		i=LocateVex(G, v1);
		j=LocateVex(G, v2);

		//无向图
		ArcNode *arc=new ArcNode;
		arc->adjvex=j;
		arc->nextarc=G.vertices[i].firstarc;
		G.vertices[i].firstarc=arc;

		arc=new ArcNode;
		arc->adjvex=i;
		arc->nextarc=G.vertices[j].firstarc;
		G.vertices[j].firstarc=arc;
	}

}

//求割点
int count ;
int visited[MAX_VERTEX_NUM];
int low[MAX_VERTEX_NUM];

//从第v0个顶点出发深搜,查找并输出关节点(割点)
void DFSArticul(ALGraph G, int v0)
{
	int min, w;
	ArcNode *p;
	visited[v0]=min=++count;//v0是第count个访问的顶点,min的初值为visited[v0],即v0的访问次序

	for(p=G.vertices[v0].firstarc; p ; p=p->nextarc)
	{
		w=p->adjvex;
		if(visited[w]==0)//w未曾访问,是v0的孩子
		{
			DFSArticul(G, w);//从第w个顶点出发深搜,查找并输出关节点(割点),返回前求得low[w]
			if(low[w]=visited[v0])//v0的孩子节点w只与v0相连,则v0是关节点(割点)
				cout<<G.vertices[v0].data<<" ";
		}
		else if(visited[w]<min)//w已访问,则w是v0生成树上祖先,它的访问顺序必小于min
			min=visited[w];
	}

	low[v0]=min;//low[v0]取三者最小值
	
}

void FindArticul(ALGraph G)
{
	int i, v;
	ArcNode *p;
	count=1;
	visited[0]=1;//从0号节点开始
	for(i=1; iadjvex;
	DFSArticul(G, v);
	if(count<G.vexnum)
	{
		cout<<G.vertices[0].data<<" ";
		while(p->nextarc)
		{
			p=p->nextarc;
			v=p->adjvex;
			if(visited[v]==0)
				DFSArticul(G, v);
		}
	}
}

void main()
{
	ALGraph g;
	CreateDG(g);

	cout<<"割点如下: "<<endl;
	FindArticul(g);
	cout<<endl;
}


 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭