UnionFind就是acm中常用的并查集...

并查集常用操作

另外补充一下STL常用操作

相关问题:

547. Friend Circles

纯裸题噢...

 class Solution {
public:
int root[];
bool v[]; void uf_init(int x)
{
for(int i=;i<=x;i++)
root[i]=i;
} int uf_find(int x)
{
if(x!=root[x])
root[x]=uf_find(root[x]);
return root[x];
} void uf_union(int x, int y)
{
int tx=uf_find(x);
int ty=uf_find(y);
if(tx!=ty)
root[tx]=ty;
} int findCircleNum(vector<vector<int>>& M)
{
int kn=M.size();
uf_init(kn);
for(int i=;i<kn;i++)
for(int j=i+;j<kn;j++)
if(M[i][j])
uf_union(i,j); memset(v,,sizeof(v));
int cnt=;
for(int i=;i<kn;i++)
if(!v[uf_find(i)])
{
cnt++;
v[uf_find(i)]=true;
}
return cnt;
}
};

Graph Valid Tree

(权限题做不了嘤嘤嘤)

684. Redundant Connection

并查集找无向图中的环,比较裸的题

 #include <iostream>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <string>
#include <cstring>
#include <cstdio>
using namespace std; class Solution {
public:
int root[]; void uf_init(int x)
{
for(int i=;i<=x;i++)
root[i]=i;
} int uf_find(int x)
{
if(x!=root[x])
root[x]=uf_find(root[x]);
return root[x];
} void uf_union(int x, int y)
{
int tx=uf_find(x);
int ty=uf_find(y);
if(tx!=ty)
root[tx]=ty;
} vector<int> findRedundantConnection(vector<vector<int>>& edges)
{
int k=edges.size();
int kx,ky;
uf_init(k);
for(int i=;i<k;i++)
{
kx=edges[i][];
ky=edges[i][];
if(uf_find(kx)!=uf_find(ky))
uf_union(kx,ky);
else
return(edges[i]);
}
}
}; int main()
{
Solution sl;
return ;
}

685. Redundant Connection II = 改成了有向图,复杂了许多......

不会做嘤嘤嘤

721. Accounts Merge

比较裸的并查集。将email重复的两个账户union一下,最后再输出每个集合

 class Solution:
def uf_init(self,x):
self.root=[0 for i in range(x+10)]
for i in range(x):
self.root[i]=i def uf_find(self, x):
if(x!=self.root[x]):
self.root[x]=self.uf_find(self.root[x])
return self.root[x] def uf_union(self, x, y):
tx=self.uf_find(x)
ty=self.uf_find(y)
if(tx!=ty):
self.root[tx]=ty def similar(self, acc1, acc2):
res=0
if(acc1[0]!=acc2[0]):
return res
for i in acc1[1:]:
for j in acc2[1:]:
if(i==j):
res=1
return res def accountsMerge(self, accounts):
"""
:type accounts: List[List[str]]
:rtype: List[List[str]]
"""
ka=len(accounts)
print(ka)
self.uf_init(ka) hsh={}
for i in range(ka):
for j in range(len(accounts[i])-1):
if(hsh.get(accounts[i][j+1])!=None):
dx=hsh[accounts[i][j+1]]
uf_union(dx,i)
else:
hsh[accounts[i][j+1]]=i dct=[set() for i in range(ka)]
lbl=["" for i in range(ka)]
for i in range(ka):
ui=self.uf_find(i)
lbl[ui]=accounts[i][0]
for j in range(len(accounts[i])-1):
dct[ui].add(accounts[i][j+1]) ans=[]
for i in range(ka):
if(lbl[i]!=""):
tmp=[]
for j in dct[i]:
tmp.append(j)
tmp.sort()
tmp=[lbl[i]]+tmp
ans.append(tmp) return ans

注意用hashmap优化掉两重循环的方法,比较常用

         for i in range(0,ka):
for j in range(i+1,ka):
if(self.similar(accounts[i],accounts[j])):
self.uf_union(i,j)

优化前

         hsh={}
for i in range(ka):
for j in range(len(accounts[i])-1):
if(hsh.get(accounts[i][j+1])!=None):
dx=hsh[accounts[i][j+1]]
uf_union(dx,i)
else:
hsh[accounts[i][j+1]]=i

优化后

399. Evaluate Division

一开始想了半天是不是数学题...其实在纸上画画可以发现,这是一个图论题......

这样就转化成了求图中每对节点最短路问题,这时小学生会选择用Floyd算法,时间复杂度O(N^3)

 #define GMAX 0x7f7f7f7f
// initiate double with maxium value:
// https://blog.csdn.net/popoqqq/article/details/38926889 class Solution {
public:
double graph[][]; vector<double> calcEquation(vector<pair<string, string>> equations,
vector<double>& values,
vector<pair<string, string>> queries)
{
memset(graph,0x7f,sizeof(graph));
cout<<graph[][]<<endl;
int kl=values.size(), kq=queries.size();
map<string,int> dict;
int dcnt=,dx,dy;
for(int i=;i<kl;i++)
{
if(dict.find(equations[i].first)==dict.end())
{
dcnt++;
dict.insert(pair<string, int>(equations[i].first, dcnt));
}
if(dict.find(equations[i].second)==dict.end())
{
dcnt++;
dict.insert(pair<string, int>(equations[i].second, dcnt));
}
dx=dict[equations[i].first];
dy=dict[equations[i].second];
graph[dx][dy]=values[i];
graph[dy][dx]=/values[i];
cout<<dx<<"--"<<dy<<" "<<values[i]<<endl;
} for(int i=;i<=dcnt;i++)
graph[i][i]=;
for(int k=;k<=dcnt;k++)
for(int i=;i<=dcnt;i++)
for(int j=;j<=dcnt;j++)
if(graph[i][k]<GMAX && graph[k][j]<GMAX)
graph[i][j]=min(graph[i][j],graph[i][k]*graph[k][j]); vector<double> ans;
string sx,sy;
for(int i=;i<kq;i++)
{
sx=queries[i].first;
sy=queries[i].second;
if(dict.find(sx)==dict.end() || dict.find(sy)==dict.end())
ans.push_back(-1.0);
else
{
dx=dict[sx];
dy=dict[sy];
if(graph[dx][dy]<GMAX)
ans.push_back(graph[dx][dy]);
else
ans.push_back(-1.0);
cout<<dx<<"__"<<dy<<endl;
}
} return ans;
}
};

但大学生们会用并查集来解呢

balabala

UnionFind问题总结的更多相关文章

  1. Union-Find 检测无向图有无环路算法

    不相交集合数据结构(Disjoint-set data structure)是一种用于跟踪集合被分割成多个不相交的子集合的数据结构,每个集合通过一个代表来标识,代表即集合中的某个成员. Union-F ...

  2. UVA - 11987 Almost Union-Find[并查集 删除]

    UVA - 11987 Almost Union-Find I hope you know the beautiful Union-Find structure. In this problem, y ...

  3. 并查集(union-find)算法

    动态连通性 . 假设程序读入一个整数对p q,如果所有已知的所有整数对都不能说明p和q是相连的,那么将这一整数对写到输出中,如果已知的数据可以说明p和q是相连的,那么程序忽略p q继续读入下一整数对. ...

  4. UVa 11987 Almost Union-Find(支持删除操作的并查集)

    传送门 Description I hope you know the beautiful Union-Find structure. In this problem, you’re to imple ...

  5. 有一种算法叫做“Union-Find”?

    前言: 不少搞IT的朋友听到“算法”时总是觉得它太难,太高大上了.今天,跟大伙儿分享一个比较俗气,但是却非常高效实用的算法,如标题所示Union-Find,是研究关于动态连通性的问题.不保证我能清晰的 ...

  6. Union-Find Algorithm

    Union-Find Algrithm is used to check whether two components are connected or not. Examples: By using ...

  7. 并查集 Union-Find

    并查集能做什么? 1.连接两个对象; 2.查询两个对象是否在一个集合中,或者说两个对象是否是连接在一起的. 并查集有什么应用? 1. Percolation问题. 2. 无向图连通子图个数 3. 最近 ...

  8. 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind

    最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...

  9. UVA 11987 - Almost Union-Find(并查集)

    UVA 11987 - Almost Union-Find 题目链接 题意:给定一些集合,操作1是合并集合,操作2是把集合中一个元素移动到还有一个集合,操作3输出集合的个数和总和 思路:并查集,关键在 ...

  10. 并查集(Union-Find)算法介绍

    原文链接:http://blog.csdn.net/dm_vincent/article/details/7655764 本文主要介绍解决动态连通性一类问题的一种算法,使用到了一种叫做并查集的数据结构 ...

随机推荐

  1. delphi combobox屏蔽鼠标滑动

    //第1种方法 procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState; WheelDelta: Integer; Mo ...

  2. WordPress版微信小程序2.4版发布

    自从发布2017年9月16日WordPress版微信小程序2.2.8版本后,这个一个多月来,WordPress版微信小程序,在经过一些比较小的更新后,今天发布阶段性的版本:2.4版 .这版本主要是功能 ...

  3. C语言中的作用域,链接属性和存储类型

    作用域 当变量在程序的某个部分被声明的时候,他只有在程序的一定渔区才能被访问,编译器可以确认4种不同类型的作用域:文件作用域,函数作用域,代码块作用域和原型作用域 1.代码块作用域:位于一对花括号之间 ...

  4. 一个java使用redis的简单案例

    这个例子中,java使用Jedis来操作Redis 1.引入Jedis的依赖 <dependency> <groupId>redis.clients</groupId&g ...

  5. git 在本地拉取远程分支的代码(并不做提交操作)

    1. git fetch 获取远程的所有分支 2. 在执行 git checkout -b local-branch-name origin/remote-branch  就可以将远程分支remote ...

  6. java并发等待条件的实现原理(Condition)

    本篇继续学习AQS中的另外一个内容-Condition.想必学过java的都知道Object.wait和Object.notify,同时也应该知晓这两个方法的使用离不开synchronized关键字. ...

  7. Pycharm:使用笔记

    1.快捷键笔记 CTRL+D:复制当前行 CTRL+/:注释选中行 CTRL+ALT+L:自动format,自动进行标准格式化 ALT + 7:查看当前文件的类和方法概览 Ctrl + Y    删除 ...

  8. leetcode75

    class Solution { public: void sortColors(vector<int>& nums) { sort(nums.begin(), nums.end( ...

  9. Spring Boot文档维护:集成Swagger2

    一.Swagger简介 在日常的工作中,我们往往需要给前端(WEB端.IOS.Android)或者第三方提供接口,这个时我们就需要提供一份详细的API说明文档.但维护一份详细的文档可不是一件简单的事情 ...

  10. Oracle一次Insert多条数据

    insert all into JK_TB_DATE (fbmmc,fgzjh,fsbmc,fsbxh,fsbbh,db_shuifenyi,db_pihao,db_wuliaobianma) ',' ...