
----dfs
欣君
追寻那如樱花般的绚烂
展开
-
51nod 1307 绳子与重物
二分枚举,判断挂上x个重物会不会使绳子断裂。判断时,可以采用dfs的方法,求出每个节点为根节点的子树的点权值和,和最大负重进行比较即可。#includeusing namespace std;const int N=50050;long long c[N],w[N],sum[N],p[N];vector vec[N];void dfs(int x){ sum[x]=w[x原创 2016-11-05 23:02:29 · 246 阅读 · 0 评论 -
51nod 1677 treecnt
可以计算出每条边出现的次数,其总和就是答案。对于任意一条边,若其左端有x个节点,右端有y个节点。那么这条边的出现次数为C(n,k)-C(x,k)-C(y,k)计算组合数时,预处理阶乘和逆元。#includeusing namespace std;const long long mod=1e9+7;const int MAXN=100100;long long fac[原创 2016-11-29 20:39:46 · 384 阅读 · 0 评论 -
51nod 1400 序列分解
只有40长度,dfs一下就好。由于剪枝,时间复杂度O(2^20)。#includeint a[44],b[44],arr[44],n,flag;void dfs(int deep,int alen,int blen){ if(deep==n||flag) { flag=1; return; } if(alen==blen) { a[alen+1]=arr[d原创 2016-11-17 21:19:24 · 272 阅读 · 0 评论 -
51nod 1388 六边形平面
首先很容易得出,最多3种颜色,就能将任意六边形图进行染色。1种颜色和2种颜色情况很容易求解。对于3种颜色,需要满足一下之一的条件:1.存在3个六边形共顶点。2.存在奇数环。奇数环可以直接用dfs求解。#include using namespace std;int go[6][2]={{0,1},{0,-1},{1,0},{-1,0},{1,-1},{-1,1}};ch原创 2016-11-20 23:13:50 · 277 阅读 · 0 评论 -
51nod 1737 配对
对于一条边来说,其理论最大贡献值为z*min(sonsum[lefnode],sonsum[rignode])。如果考虑所有配对都经过树的重心,那么可以做到所有边的贡献值都为理论最大贡献值。dfs计算下即可。#includeusing namespace std;const int MAXN=100100;struct edge{ long long x,w;}etmp;ve原创 2017-02-07 16:19:33 · 270 阅读 · 0 评论 -
51nod 1199 Money out of Thin Air
利用dfs序(先序遍历),将树对应到一维数组上。然后用线段树更新求解。#includeusing namespace std;const int MAXN=50050;vector vec[MAXN];int sonsum[MAXN],w[MAXN],mp[MAXN],num[MAXN];int tim;struct node{ int l,r; long long ns原创 2017-02-15 16:21:53 · 593 阅读 · 0 评论 -
51nod 1766 树上的最远点对
线段树套LCA。。。写了近200行对于区间[a,b]和区间[c,d]上各选一点的最大长度,必定等于区间[a,b]内最远点对中的某一点,与区间[c,d]内最远点对中的某一点,这两点的距离。因为有这个性质,就可以在线段树上进行查询了。注意线段树中的合并merge操作,与求答案时的merge操作,有些不同。#include using namespace std;void read(int原创 2017-02-26 16:23:44 · 448 阅读 · 0 评论 -
CCCC天梯赛 L3-015. 球队“食物链”
哈密顿回路问题,很经典。(但弱鸡的我,第一次做哈密顿回路的题。。。。)这题有坑,比赛的时候被坑了两个点,6分WA掉了。比赛采用主客场双循环赛制,也就是说,可能出现A赢了B,B也赢了A,或者A输给了B,B也输给了A的情况。神坑。。。然后单纯的dfs,会T。比赛的时候8分T掉了。。。首先,因为要输出字典序最小。因此,可以直接从1开始搜索。如果搜不到,那么从其他点也是搜不到的。然原创 2017-03-28 18:56:05 · 629 阅读 · 0 评论 -
51nod 1610 路径计数
因为是无环图,所以可以用记忆化搜索做。可以根据公约数,将图拆成100个子图。由于有重复,所以再加上容斥。#includeusing namespace std;const long long mod=1e9+7;const int MAXM=50050;long long dp[110];int a[MAXM],b[MAXM],c[MAXM];int mat[110][1原创 2017-07-23 16:23:19 · 359 阅读 · 0 评论