【本质是看别人的代码学东西】

1.邻接矩阵访问图所需数据结构

int edge[][];

int visited[];

 其中 visited 需要初始化全部为0,一种相对简单的方式是使用 #include<memory.h>/<string.h> 的 memset函数:

memset(visited,0,sizeof(visited));

2.邻接矩阵访问图的两种基本方法

DFS:

void dfs( int v ) {
	visited[v] = 1;
	for (int i = 1; i <= N; i++) {
		if (!visited[i] && edge[i][v] == 1)
			dfs(i);
	}
}

BFS:

void bfs(int v) {
	queue<int> q;
	q.push(v);
	visited[v] = 1;
	while (!q.empty()) {
		int n = q.front();
		q.pop();
		for (int i = 1; i <= N; i++) {
			if (!visited[i] && edge[n][i] == 1) {
				q.push(i);
				visited[i] = true;
			}
		}
	}
}

3.cin和cout的性能很差,摘:

cout和cin的设计,可能比我们想象的复杂的多,从实际测试的结果,速度比printf和scanf慢一个数量级以上。影响cout和cin的性能的有两个方面:同步性和缓冲区,同步性可以通过ios_base::sync_with_stdio(false)禁用;操作系统会对缓冲区进行管理和优化,但十分有限,使用了endl之后,会对缓冲区执行清空操作,这个过程会先执行’\n’,再执行flush操作,非常漫长,所以尽量使用‘\n’而不是endl执行换行。然后,还有一个cout和cin的绑定效果,两者同时使用的话,cin与cout交替操作,会有一个flush过程,所以还是会很漫长,可以通过cin.tie(0)禁用绑定。
————————————————
版权声明:本文为CSDN博主「CodeLike」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cv_jason/article/details/81019874

 4.并查集两个核心算法

Find(查找根节点)

int father[];

for( int i = 0 ; i < father.size() ; i ++ ){
	father[i] = i;
}

int findFather(int child) {
	if (child == father[child])
		return child;
	return father[child] = findFather(father[child]);
}

 

union/merge(压缩路径)

 

void merge(int u, int v) {
	int fu = find(u);
	int fv = find(v);
	if (fu != fv) {
		father[fu] = fv;
	}
}

5.科学计数法: 1e5 = 1*105

6.注意双等号!!


0 条评论

发表评论

Avatar placeholder