UnionFind问题总结
UnionFind就是acm中常用的并查集...
相关问题:
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问题总结的更多相关文章
- Union-Find 检测无向图有无环路算法
不相交集合数据结构(Disjoint-set data structure)是一种用于跟踪集合被分割成多个不相交的子集合的数据结构,每个集合通过一个代表来标识,代表即集合中的某个成员. Union-F ...
- UVA - 11987 Almost Union-Find[并查集 删除]
UVA - 11987 Almost Union-Find I hope you know the beautiful Union-Find structure. In this problem, y ...
- 并查集(union-find)算法
动态连通性 . 假设程序读入一个整数对p q,如果所有已知的所有整数对都不能说明p和q是相连的,那么将这一整数对写到输出中,如果已知的数据可以说明p和q是相连的,那么程序忽略p q继续读入下一整数对. ...
- UVa 11987 Almost Union-Find(支持删除操作的并查集)
传送门 Description I hope you know the beautiful Union-Find structure. In this problem, you’re to imple ...
- 有一种算法叫做“Union-Find”?
前言: 不少搞IT的朋友听到“算法”时总是觉得它太难,太高大上了.今天,跟大伙儿分享一个比较俗气,但是却非常高效实用的算法,如标题所示Union-Find,是研究关于动态连通性的问题.不保证我能清晰的 ...
- Union-Find Algorithm
Union-Find Algrithm is used to check whether two components are connected or not. Examples: By using ...
- 并查集 Union-Find
并查集能做什么? 1.连接两个对象; 2.查询两个对象是否在一个集合中,或者说两个对象是否是连接在一起的. 并查集有什么应用? 1. Percolation问题. 2. 无向图连通子图个数 3. 最近 ...
- 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind
最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...
- UVA 11987 - Almost Union-Find(并查集)
UVA 11987 - Almost Union-Find 题目链接 题意:给定一些集合,操作1是合并集合,操作2是把集合中一个元素移动到还有一个集合,操作3输出集合的个数和总和 思路:并查集,关键在 ...
- 并查集(Union-Find)算法介绍
原文链接:http://blog.csdn.net/dm_vincent/article/details/7655764 本文主要介绍解决动态连通性一类问题的一种算法,使用到了一种叫做并查集的数据结构 ...
随机推荐
- 深度森林DeepForest
级联森林(Cascade Forest) 级联森林结构的图示.级联的每个级别包括两个随机森林(蓝色字体标出)和两个完全随机树木森林(黑色). 假设有三个类要预测,因此,每个森林将输出三维类向量,然后将 ...
- solr schema.xml Field属性详解
<field name="id" type="string" indexed="true" stored="true&quo ...
- Python的set集合
set集合也用{}表示,set中的元素是不重复的.无序的,且它里面的元素必须是可hash的(int,str,tuple,bool),set是可变的. 1.使用set去重 m = [1, '] s = ...
- SpringBoot 六问
1.什么是springboot 用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件) 创建独立 ...
- redis-缓存失效三种策略(FIFO 、LRU、LFU)
缓存失效策略(FIFO .LRU.LFU三种算法的区别) 当缓存需要被清理时(比如空间占用已经接近临界值了),需要使用某种淘汰算法来决定清理掉哪些数据.常用的淘汰算法有下面几种: FIFO:First ...
- 代码: 两列图片瀑布流(一次后台取数据,图片懒加载。下拉后分批显示图片。图片高度未知,当图片onload后才显示容器)
代码: 两列图片瀑布流(一次后台取数据,无ajax,图片懒加载.下拉后分批显示图片.图片高度未知,当图片onload后才显示容器) [思路]: 图片瀑布流,网上代码有多种实现方式,也有各类插件.没找到 ...
- 函数内联 inline,__inline,__forceinline
▶ 感谢大佬的总结[http://www.cnblogs.com/xuemaxiongfeng/articles/2464850.html] ● 存储限定符 __inline 与关键字 inline ...
- hive 表锁和解锁
场景: 在执行insert into或insert overwrite任务时,中途手动将程序停掉,会出现卡死情况(无法提交MapReduce),只能执行查询操作,而drop insert操作均不可操作 ...
- git中提交了想要忽略的文件,如何在删除
我们在用git的时候,有时会不小心将不需要文件跟踪的文件(如.classpath文件.project等)提交到git的服务器,这时候要忽略这些文件的做法是: 1.修改.gitignore文件 按照规则 ...
- Open SuSE 安装Python3.6
1. 下载Python3.6 tar包 去除Modules/Setup文件167行的注释 readline readline.c -lreadline -ltermcap 2. 下载readline- ...