摘要:
算法 01背包+并查集 思路 既然这样,那这道题是否可以转换为01背包呢? 答案很明显是可以的。可以利用并查集,将这m组配对购买的商品划到一个集合里,这样就可以确定买了其中一个就得买另一个。 最后就是01背包啦! 代码 #include <cstdio> #include <iostream> #i 阅读全文
摘要:
#include <cstdio> #include <cmath> #include <cstring> #include <queue> #include <iostream> #include <algorithm> using namespace std; int h[50001],ne[5 阅读全文
摘要:
算法 最小生成树 思路 其实就是一道最小生成树的模板题,我在这里用的是kruskal算法,唯一需要注意的是每加入一条边都要判断s,t是不是在一个集合里面,这样就可以顺利AC了。(排序了) 代码 #include<cstdio> #include<cstring> #include<iostream> 阅读全文
摘要:
算法 最短路+变式 思路 我们仔细思考一下,对于任意一个点,到它的最大拥挤度的最小值肯定是与它相邻的一个点的此值和他们之间的边权值取一个max,然后在所有max中取一个min! 这样我们就可以想到只要把板子里的松弛稍微修改一下,即只需把原本的求和改为取max就ok了! 另,注意此题应构无向图!! 代 阅读全文
摘要:
算法 最小生成树+kruskal 代码 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define N 1005 using namespace std; int 阅读全文
摘要:
#include<bits/stdc++.h> using namespace std; struct hh { int x,y,t; }a[200000]; int f[200000],n,m; int cmp(const hh &a,const hh &b){return a.t<b.t;} i 阅读全文
摘要:
算法 并查集+扩展域 思路 扩展域并查集维护三个域:x_self同类,x_enemy天敌,x_eat捕食。 他们之间的关系: 假设有x,y两个动物, 如果题目给定x和y是同类,那么合并x_self,y_self和x_enemy,y_enemy和x_eat和y_eat。 前提条件是:x_self与y_ 阅读全文
摘要:
算法 并查集+带权 思路 链也是树。接到后面等同于合并集。 find int get(int x) { if (x == fa[x]) return x; int root = get(fa[x]); d[x] += d[fa[x]]; return fa[x] = root; } 修改 int m 阅读全文
摘要:
算法 并查集+离散化 思路 离散化 sort(l,l+tot); int start=unique(l,l+tot)-l; for(int i=1;i<=n;++i){ a[i].x=lower_bound(l,l+start,a[i].x)-l; a[i].y=lower_bound(l,l+st 阅读全文
摘要:
算法 二分图+最小独立集 思路 在日字形内两点连边(1),必处于不同色格子(0)。为二分图。要互不相扰,求最大独立集。 核心 最大匹配 bool dfs(int x, int y) { for (int i = 0; i < 8; i++) { int nx = x + dx[i], ny = y 阅读全文
摘要:
算法 二分图+最小点覆盖 思路 详见《进阶指南》 代码 #include <cstdio> #include <vector> #include <cstring> #include <iostream> using namespace std; const int N = 56; int n, m 阅读全文
摘要:
算法 二分图+最小点覆盖 思路 节点 A的模式为左部节点,B的模式为右部节点 边 一个物品的A与B间连边。 2要素 及一条边中必选有一个节点 ,(要么在A加工,要么在B加工) 代码 #include <cstdio> #include <vector> #include <cstring> #inc 阅读全文
摘要:
算法 二分图+匹配 思路 节点 列与行皆为节点 边 一个子链接一个边与一个列。 0要素 一个子不可在两列或是两行。所以连接一个行与一个趔 1要素 每行只可有一个子,列也一样。 代码 #include<cmath> #include<cstdio> #include<cstring> #include 阅读全文
摘要:
判定 染色法 bool dfs(int x, int color) { v[x] = color; for (unsigned int i = 0; i < e[x].size(); i++) { int y = e[x][i].first; if (v[y]) { if (v[y] == colo 阅读全文
摘要:
算法 二分图+匹配 思路 边 一个骨牌链接两个格子,格子为节点,骨牌为连接两个格子的边。 0要素 将格子黑白染色,同色格子间没有边。 1要素 每个格子只能被1个骨牌覆盖,唯一边。 知识 匈牙利 bool dfs(int x) { for (unsigned int i = 0; i < e[x].s 阅读全文
摘要:
算法 二分图+判定 思路 显然要让答案最小,应让怨气值较大的不在同一监狱。尽量让较小的在同一个监狱里矛盾。及分成两个集合。满足二分图。而后二分答案,以最后的怨气值为mid,凡大于mid的罪犯都需在不同集合,只需判定是否为二分图即可。 核心 二分图判定+染色法 bool dfs(int x, int 阅读全文