题目描述 给出N个点,M条边的有向图,对于每个点v,求A(v)表示从点v出发,能到达的编号最大的点。 输入格式 第1 行,2 个整数N,M。 接下来MM行,每行2个整数Ui,Vi,表示边(Ui,Vi)。点用1,2,⋯,N编号。 输出格式 N 个整数A(1),A(2),⋯,A(N)。 输入输出样例 输入 #1复制 4 3 1 2 2
人,该复习还是要复习的 -----我自己 2022/6/4 正好明天集训了,那就从今天开始复习复习,捡起遗忘的知识,板子不能忘啊 从今天开始写,也不知道什么时候能写完,其实根本没有尽头,学到新东西也会写的 那就开始吧/)(\ 一.图论 1.dijkstra(堆优化) 例题:I. 香甜的黄油 -
对于度数\(<k\)的点可以快速的求出包含它的团,问题就是解决度数比较大的团 注意到题目特殊限制,没有一个导出子图所有点度数都较大,所以一定可以通过不停地遍历、删除度数\(<k\)的点来遍历整张图(类似于拓扑排序) 并且我们可以发现对于一个已经check的点删除后不会对答案有影响,所以我们
如果没有敌对关系,枚举一共选 \(i\) 个人,如果有 \(j\) 个人满足 \(i\in [l_j,r_j]\),那么方案数是 \(\binom{i}{j}\)。 接下来考虑限制,由于 \(m\leq 20\),考虑容斥,直接钦定一个集合 \(S\),其中所有为 \(1\) 的位置对应的限制必选,这个方案数也是一个组合数。由于钦定选定的位置最多也就
视频链接: #include<algorithm> #include<cstring> #include<iostream> #include<queue> #define N 30010 #define INF 1000000000 using namespace std; int n,m,a,b,c; struct edge{int v,w;}; vector<edge> e[N]; int vis[N],cnt[N]; long lon
视频链接: // P3379 【模板】最近公共祖先(LCA) #include <iostream> #include <algorithm> #include <cstring> #include <vector> using namespace std; const int N=500005,M=2*N; int n,m,s,a,b; vector<int> e[N]; vector<pair<int,int>>q
Prim O(mlogm) memset(dis, 80, sizeof(dis)); q.push({ 1,0 }); dis[1] = 0; while (!q.empty()) { int u = q.top().s; q.pop(); if (vis[u])continue; vis[u] = true, ++num, ans += dis[u]; for (int i
题面描述 求不定方程 \[\frac{1}{x}+\frac{1}{y}=\frac{1}{n!} \]的正整数解\((x,y)\)的数目。 题解 小数学题+高精度 \[\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}\\\frac{x+y}{x*y}=\frac{1}{n!}\\x*y-x*n!-y*n!=0\\x*y-x*n!-y*n!+(n!)^2=(n!)^2\\(x-n!)*(y-n!)=(n!)^2 \]方案数就是
y总做法:建立一个虚拟原点,到所有物品的距离为物品原本价值,物品之间的价值为交易价值,枚举等级范围跑最短路即可 我的做法:以女儿为原点反向建图,物品之间的距离为交易价值,到每个物品的最短路加上这个物品的原本价值即为总花费,取最小 时间复杂度均为O(n^2*logn)(dij堆优化) #inclu
题面 这个题是二维的情况,一个点向一个矩形连边。一维的时候就是线段树优化建图,这里只能树套树优化建图了。但是这道题空间只有128MB,显然空间不能达到 \(O(n\log^2 n)\) 级别,所以考虑线段树套平衡树 (set) 来解决。 一个通常用来解决这种问题的方案是,不直接连边,而是把每个矩形在跑
反正可以直接当 \(k=3\) 去做,然后考虑直接去构造。 首先任意给树找一个根,然后将整棵树拆成几个大小为 \(\sqrt n\) 的子树,将所有这些子树的根 \(u\) 塞到一个点集 \(a\) ,然后将 \(a\) 中的点相互连接,边的数量为 \(\mathcal O(n)\)。 接着,对于点集 \(a\) 中的每个点 \(u\),将 \(u\)
A - 数据结构实验之图论十:判断给定图是否存在合法拓扑序列 题目链接 https://acm.sdut.edu.cn/onlinejudge3/contests/3990/problems/A 判定拓扑序列模板题 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,flag; 4 int mapp[1010][1010]; 5 int vis[1010];
具体不是很懂,代码如下: #include<iostream>using namespace std;int n;//需要全排列的数字数量 int num[20];//数值数组int vis[20];//标记数组 int main(){ void dfs(int step); cin >> n; dfs(1); return 0;} void dfs(int step){ if(step == n+1){//跳出递归条件 for(int i=1;
先用迪杰斯特拉剪枝,再dfs确定最佳方案 #include<bits/stdc++.h> using namespace std; typedef pair<int,int> pii; const int N = 4010,INF = 0x3f3f3f3f; int n,m,c,t; int nums[N]; int head[N],dis[N],vis[N],cnt; int send=INF,bring=INF; struct BIAN{ int to,next
题目是让找一个长度不为一的环,用DFS即可。 #include <iostream> #include <cstring> using namespace std; char mp[510][510]; bool vis[210][210]; int n, m; int fx[] = {0, 0, 1, -1}, fy[] = {1, -1, 0, 0}; bool flag; void dfs(int x, int y, int c, int d) { vis[x]
求最长路,可以用spfa做, 数组要开到1e6,否则会超时 #include <iostream> #include <queue> #include <cstring> using namespace std; const int N = 1e6 + 10; const int INF = 0x3f3f3f3f; #define x first #define y second int ne[N], e[N], w[N], h[N], idx, in[N]; type
剑指offer(38) 剑指 Offer 38. 字符串的排列 输入一个字符串,打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。 示例: 输入:s = "abc" 输出:["abc","acb","bac","bca","cab","cba"] 限制: 1 <= s 的长度 <= 8 利用回溯方法去解决这个问
邻接矩阵写法: 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int inf=0x3f3f3f3f; 4 const int maxn=1e5+10; 5 int vis[maxn],dist[maxn]; 6 int n,m,a,b; 7 struct node 8 { 9 int dis,to; 10 bool operator<(const node x) const 11
差分约束模板 典型的 $x_u - x_v <= y$ 形式 #include<iostream> #include<cstring> #include<queue> #define maxn 50007 using namespace std; struct edge { int to, val, nxt; }g[maxn]; int n, m, cnt, dis[maxn], hd[maxn], sum[maxn]; bool vis[maxn
什么是生成树 子图:G=<V,E>,G'=<V', E'>,为两个图(V为点集,即图中点的集合,E为边集),如果V'是V的子集且E'是E的子集,则G'是G的子图。 如果V'=V,则称G'为G的生成子图 如果G'是无向生成子图且是树的结构,则为生成树 最小生成树 最小生成树:是一张有权无向连通图中边权和最小的生成树 Prme算法:
Codeforces Global Round 20 https://codeforces.com/contest/1672 A.Log Chopping 思路 统计总共要被划分多少次,判断奇偶性:奇数则先手胜出,偶数则后手胜出 Code #include <bits/stdc++.h> using namespace std; int main () { int t; cin >> t; while (t --) {
首先区间个数可以转化为前缀和的形式 然后就是差分约束了 最少包含多少个数 就是不等式为a>=b+c 的形式 只要满足了最长路的不等式 其他所有的不等式也都满足 就是跑一遍最长路 差分约束的关键在于这个约束 一定要把所有的限制条件找出来 这个题看似只有一个区间个数的限制 其实
class Solution { public: int getarea(vector<int>& a, vector<int>& b, vector<int>& c){ int x1 = b[0] - a[0], y1 = b[1] - a[1], x2 = c[0] - a[0], y2 = c[1] - a[1]; return x1 * y2 - x2 * y1; } vector&
题目描述 K(1≤K≤100)只奶牛分散在N(1≤N≤1000)个牧场.现在她们要集中起来进餐.牧场之间有M(1≤M≤10000)条有向路连接,而且不存在起点和终点相同的有向路.她们进餐的地点必须是所有奶牛都可到达的地方.那么,有多少这样的牧场呢? 输入 第一行三个数,K,N,M 接下来K+1行,每行一个数表示
Tarjan的一些学习心得与错误 在原始 \(Tarjan\) 的模板代码中, \(low\) 的处理一般是像下面这样: inline void Tarjan(int u){ dfn[u]=low[u]=++tim; GOGRA(e,head,u,i){ int v=e[i].to; if(vis[v]==0){ Tarjan(v); low[u]=min(low[u],low[v]); }else if(vis[v]==1){