并查集
Jaster_wisdom
程序员
展开
-
POJ 1251 (最小生成树)
很明显,这是一道 最小生成树的例子。也就是,从图中选取若干条边将所有顶点连接起来,并且所选取的这些边的权值之和最小。 算法:Prim算法,或者 Kruskal算法 Prim算法: 首先选择一个点为起点,然后找到与该边相邻权值最小的边,选中该边上的另一个点,然后选择 与选中点 相连接的最小边,这样循环下去,直到包含所有节点 用d[i]表示 与 i 点相邻的最短边的权值,这点是与 Dijks原创 2016-03-16 10:30:17 · 979 阅读 · 0 评论 -
POJ 1861
题目大意: 某公司需要用线缆将网络中的结点连接起来,每两个结点之间有一个权值,选择若干条线缆,要求是任意两个点之间可达,并且要使最长的线缆最小。 思路: 本质上将就是一个最小生成树的例子,因为这里要输出最长的线缆长度,所以用Kruskal算法较为便捷。 Kruskal算法就是 不断地选择不构成环的最小的边。不构成环,这里用的是 并查集,看看两者是不是可达。 这里着重讲一下并查集。首先原创 2016-04-01 09:30:22 · 687 阅读 · 0 评论 -
POJ 1308
题目大意就是判断是否为一棵树? 成为一棵树的条件是:只有一个根节点、非根节点只有一个入度 这里要注意的是,空树也是树,森林不是树,1 1 0 0 不是树,自己不能指向自己 #include using namespace std; #define MAX 105 int p[MAX]; bool flag[MAX]; int Find(int a){ //并查集,递归寻找根节点原创 2016-04-02 22:07:28 · 721 阅读 · 0 评论 -
POJ 2524 (并查集)
题目大意: 已知一个学校有不同的种族,给定n个人,和m对人,每对人他们的信仰一样,问n个人有多少种信仰?前提是每个人只有一个信仰 思路:如果a和b信仰相同,那么他们就属于同一集合。如果a和c相同,那么就把c加入到该集合中,很明显,属于同一集合里面的人信仰相同,那么问题就变成了求这n个人共有多少个集合。 首先,将n个人初始化为n个集合,发现a和b之间信仰相同并且它们之间不构成环的话,集合原创 2016-04-03 21:15:28 · 618 阅读 · 0 评论