图的分块

Posted uid001

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图的分块相关的知识,希望对你有一定的参考价值。

例1. hdu 4858 项目管理

按点的度数划分为重点(deg>=sqrt(m))和轻点(deg<sqrt(m)), 轻点暴力更新, 重点只更新邻接的重点

 

#include <iostream>
#include <algorithm>
#include <math.h>
#include <cstdio>
#include <vector>
#define pb push_back
#define REP(i,a,n) for(int i=a;i<=n;++i)
using namespace std;
typedef long long ll;

const int N = 1e5+10, INF = 0x3f3f3f3f;
int n, m, q, sqn;
int deg[N], u[N], v[N];
ll sum[N], val[N];
vector<int> g[N];

void work() {
	scanf("%d%d", &n, &m), sqn = sqrt(m);
	REP(i,1,n) g[i].clear(), deg[i]=sum[i]=val[i]=0;
	REP(i,1,m) {
		scanf("%d%d", u+i, v+i);
		++deg[u[i]], ++deg[v[i]];
	}
	REP(i,1,m) {
		if (deg[u[i]]>=sqn&&deg[v[i]]>=sqn) {
			g[u[i]].pb(v[i]),g[v[i]].pb(u[i]);
		}
		if (deg[u[i]]<sqn) g[u[i]].pb(v[i]);
		if (deg[v[i]]<sqn) g[v[i]].pb(u[i]);
	}
	scanf("%d", &q);
	REP(i,1,q) {
		int op, x, v;
		scanf("%d%d", &op, &x);
		if (op==0) {
			scanf("%d", &v);
			val[x] += v;
			for (int y:g[x]) if (deg[y]>=sqn) sum[y]+=v;
		} else {
			ll ans = 0;
			if (deg[x]<sqn) for (int y:g[x]) ans += val[y];
			else ans = sum[x];
			printf("%lld
", ans);
		}
	}
}

int main() {
	int t;
	scanf("%d", &t);
	REP(i,1,t) work();
}

 

 

例2: hdu 4467 Graph

 

以上是关于图的分块的主要内容,如果未能解决你的问题,请参考以下文章

片段类在意图的 startactivity 方法中显示错误

MATLAB | 基于分块图布局的三纵坐标图绘制

MATLAB | 基于分块图布局的三纵坐标图绘制

如何保存底部导航片段的状态 - 具有单个导航图的 Android 导航组件

[2016北京集训试题15]cot-[分块]

分块代码