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. 记录 Ext 日历月份选择控件bug解决过程结果

    目录 背景 代码 背景 项目使用 Ext.NET 2.2.0.40838 , 对应 Ext JS4.2 版本. 结果 2017/3/31 号的时候偶然间点日历选择控件选择2月,10月等月份突然就跳到3 ...

  2. (整理)MySQL_REHL6.5 安装MySQL5.5

    1 根据系统选择Mysql版本 https://dev.mysql.com/downloads/mysql/5.5.html?os=31&version=5.1 在命令行的方式下,REHL/C ...

  3. ie和dom事件流的区别

    1.事件流的区别 IE采用冒泡型事件 Netscape使用捕获型事件 DOM使用先捕获后冒泡型事件 示例: 复制代码代码如下: <body> <div> <button& ...

  4. 可视化神器--Plotly

    数据分析离不开数据可视化.我们最常用的就是pandas,matplotlib,pyecharts当然还有Tableau,看到一篇文章介绍plotly制图后我也跃跃欲试,查看了相关资料开始学习plotl ...

  5. list按照某个元素进行排序

    import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.u ...

  6. 将LinkedHashMap转换为需要的对象

    项目中,在获取json数据转换为list类型以后,本来以为可以直接使用,结果在使用中报错“java.lang.ClassCastException: java.util.LinkedHashMap c ...

  7. python中类与对象之继承

    面对对象的三大特性之继承 1.什么是继承? 在程序中,继承指的是class与class之间的关系 继承是一种关系,必须存在两个class才能产生这种关系:被继承的class称为父类,继承的class称 ...

  8. html 中使用 iconfont、fontAwesome

    在HTML中尽量使用iconfont 替代图片有很多好处,而且方便,可以设置大小.颜色 等 可以用于字体的设置. 一.使用iconfont 1.打开iconfont 官网 iconfont.cn. 2 ...

  9. wdk驱动开发的特点

    本文介绍WDK开发的一些特点.与应用层开发的差异性,不能混为一谈. 一.函数的调用点 在内核编程中,一个函数往往有多个调用点,而应用层中一个函数一般只在main里面有调用点.内核函数调用点一般在: 1 ...

  10. Curl 基本命令

    下载单个文件,默认将输出打印到标准输出中(STDOUT)中 curl http://www.centos.org 通过-o/-O选项保存下载的文件到指定的文件中:-o:将文件保存为命令行中指定的文件名 ...