搜索

1.图的深度优先遍历

void dfs(int x)
{
	v[x]=1;
	for(int i=h[x];i;i=ne[i]){
		int y=ver[i];
		if(v[y]) continue;
		dfs(y);
	}
}

2.树的dfs序。

void dfs(int x)
{
	a[++m]=x;
	v[x]=1;
	for(int i=h[x];i;i=ne[i]){
		int j=ver[i];
		if(v[j]) continue;
		dfs(j);
	}
	a[++m]=x;
}

 3.树的深度。

void dfs(int x)
{
	v[x]=1;
	for(int i=h[x];i;i=ne[i]){
		int j=ver[i];
		if(v[j]) continue;
		d[j]=d[x]+1;
		dfs(j);
	}
}

4.树的重心

void dfs(int u)
{
	v[u]=sz[u]=1;
	int mx=0;
	for(int i=h[u];i;i=ne[i]){
		int j=ver[i];
		if(v[j]) continue;
		dfs(j);
		sz[u]+=sz[j];
		mx=max(mx,sz[j]);
	}
	mx=max(mx,n-sz[u]);
	if(mx<ans){
		ans=mx;
		pos=u;
	}
}

5.bfs

void bfs()
{
	MEM(d,0);
	queue<int>q;
	q.push(1),d[1]=1;
	while(q.size()>0){
		int x=q.front();
		q.pop();
		for(int i=h[x];i;i=ne[i]){
			int y=ver[i];
			if(d[y]) continue;
			d[y]=d[x]+1;
			q.push(y);
		}
	}
}

6.拓扑排序

void add(int x,int y)
{
	ver[++tot]=y,ne[tot]=h[x],h[x]=tot;
	++d[y];
}
void topsort()
{
	queue<int>q;
	rep(i,1,n+1) if(!d[i]) q.pop(i);
	while(q.size()){
		int x=q.front();
		q.pop();
		a[++cnt]=x;
		for(int i=h[x];i;i=ne[i]){
			int y=ver[i];
			if(--d[y]==0) q.push(y);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值