模板

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

dist[x] = 0; visit[x] = 1;
queue<int> Q; Q.push(x); while (!Q.empty()) { int x = Q.front(); Q.pop();
for (int i = 0; i < e[x].size(); ++i)
if (!visit[e[x][i]]) { Q.push(e[x][i]); visit[e[x][i]] = 1;
if (tot != n)
return false; else return true; }
拓扑排序
vector<int> e[1005];
int topo[1005], tot; void dfs(int x) {
visit[x] = 1;
for (int i = 0; i < e[x].size(); ++i) if (!visit[e[x][i]]) dfs(e[x][i]); topo[--tot] = x;
heap.push(MP(-dist[e[x][i]], e[x][i]));
} } }
拓扑排序同时判断图是否有环
int indeg[1005]; int topo[1005]; bool toposort() { for (int x = 0; x < n; ++x) for (int i = 0; i < e[x].size(); ++i)
if (n & 1) t *= x;
return t;
}
}
快速幂运算——非递归
int pow(int x, int n) { int ret = 1; while (n) { if (n & 1) ret *= x;
n >>= 1; x *= x;
}
return ret;
}
最大公约数
int gcd(int a, int b) { return a ? gcd(b % a, a) : b; }
}
} }
最小生成树-prim
vector<int> e[1005], w[1005]; int prim(int x) { memset(visit, 0, sizeof(visit)); memset(dist, 0x3f, sizeof(dist)); priority_queue<pII> heap; heap.push(MP(0, x)); int ret = 0; while (!heap.empty()) { pII t = heap.top(); heap.pop(); x = t.second; ret += -t.first; if (visit[x]) continue; visit[x] = 1; for (int i = 0; i < e[x].size(); ++i) if (w[x][i] < dist[e[x][i]]) { dist[e[x][i]] = w[x][i]; heap.push(MP(-dist[e[x][i]], e[x][i])); } } return ret; }
bool cmp(const edge&a, const edge&b) {
return a.z < b.z; } int fa[10005]; int getfa(int x) { if (fa[x] == 0) return x; else return fa[x] = getfa(fa[x]);
统计有向无环图路径数量
void getpnum(int x) { toposort(); memset(pnum, 0, sizeof(pnum)); pnum[x] = 1; for (int k = 0; k < n; ++k) { int x = topo[k]; for (int i = 0; i < e[x].size(); ++i) pnum[e[x][i]] += pnum[x]; } }
}
最小生成树-kruskal
edge e[M]; int kruskal() {
sort(e, e + m, cmp);
int ans = 0; for (int i = 0; i < m; ++i) { int x = getfa(e[i].x), y = getfa(e[i].y); if (x != y) { ans += e[i].z; fa[x] = y;
int gcd(int a, int b) {
if (a == 0) return b;
else return gcd(b % a, a);
}
最小公倍数
int lcm(int a, int b) { return a / gcd(a, b) * b; }
扩展欧几里得算法
int exgcd(int a, int b, int&x, int&y) {
++indeg[e[x][i]];
queue<int> q; for (int x = 0; x < n; ++x) if (!indeg[x]) q.push(x); int tot = 0; while (!q.empty()) {
int x = q.front(); q.pop();
topo[tot++] = x; for (int i = 0; i < e[x].size(); ++i) if (--indeg[e[x][i]] == 0) q.push(e[x][i]); }
代码模板
清华大学 计算机科学与技术系2011级 李振
NOIP中需要掌握的知识
数据结构 链表,队列,栈,快速排序
优先队列,多叉树,二叉树,并查集
STL中常用数据结构的使用
NOIP中需要掌握的知识
图论
图的存储方式 DFS, BFS, 拓扑排序, 有向无环图DAG, 二分图判定
for (int i = 0; i < e[x].size(); ++i)
if (dist[x] + w[x][i] < dist[e[x][i]]) { dist[e[x][i]] = dist[x] + w[x][i]; heap.push(MP(-dist[e[x][i]], e[x][i])); pnum[e[x][i]] = pnum[x]; } else if (dist[x] + w[x][i] == dist[e[x][i]]) pnum[e[x][i]] += pnum[x]; } }
最短路径,最小生成树,最大生成树
最短路径相关统计问题 差分约束系统
更多
NOIP中需要掌握的知识
数论
欧几里得算法,扩展欧几里得算法,模线性同余方程 快速幂运算,质数判定,质因子分解 常用的一些数学性质 贪心
更多
图论——dfs
vector<int> e[1005];
for (int k = 0; k < 4; ++k) {
int nx = x + dx[k], ny = y + dy[k]; if (!visit[nx][ny]) { visit[nx][ny] = 1; dist[nx][ny] = dist[x][y] + 1; q.push(MP(nx, ny)); } } } }
void dfs(int x) {
visit[x] = 1;
for (int i = 0; i < e[x].size(); ++i) if (!visit[e[x][i]]) dfs(e[x][i]); }
图论——bfs
vector<int> e[1005];
void bfs(int x) { memset(visit, 0, sizeof(visit));
}
void toposort() { tot = n;
memset(visit, 0, sizeof(visit));
for (int i = 0; i < n; ++i) if (!visit[i]) dfs(i); }
最小生成树-kruskal
struct edge {
int x, y, z; };
if (a == 0) { x = 0; y = 1; return b;
heap.push(MP(0, x)); while (!heap.empty()) { pII t = heap.top(); heap.pop(); x = t.second;
if (visit[x]) continue;
visit[x] = 1; for (int i = 0; i < e[x].size(); ++i) if (dist[x] + w[x][i] < dist[e[x][i]]) { dist[e[x][i]] = dist[x] + w[x][i];
走迷宫
int dx[] = {0, 0, -1, 1}, dy[] = {-1, 1, 0, 0}; bool visit[1005][1005];
int dist[1005][1005];
#define MP make_pair void bfs(int x, int y) { queue<pII> q; q.push(MP(x, y)); memset(visit, 0, sizeof(visit)); visit[x][y] = 1; dist[x][y] = 0; while (!q.empty()) { pII t = q.front(); q.pop(); x = t.first; y = t.second;
统计最短路数量
vector<int> e[1005], w[1005]; int pnum[1005];
void dijstra(int x) {
memset(visit, 0, sizeof(visit)); memset(dist, 0x3f, sizeof(dist)); priority_queue<pII> heap; heap.push(MP(0, x)); pnum[x] = 1; while (!heap.empty()) { pII t = heap.top(); heap.pop(); x = t.second; if (visit[x]) continue; visit[x] = 1;
dist[e[x][i]] = dist[x] + 1;
} } }
最Hale Waihona Puke Baidu路——spfa
vector<int> e[1005], w[1005]; void spfa(int x) { queue<int> q; memset(visit, 0, sizeof(visit)); memset(dist, 0x3f, sizeof(dist)); dist[x] = 0; q.push(x); visit[x] = 1; while (!q.empty()) { int x = q.front(); q.pop(); for (int i = 0; i < e[x].size(); ++i) if (dist[x] + w[x][i] < dist[e[x][i]]) { dist[e[x][i]] = dist[x] + w[x][i]; if (!visit[e[x][i]]) { visit[e[x][i]] = 1; q.push(e[x][i]); } } visit[x] = 0; }
最短路——dijkstra
vector<int> e[1005], w[1005]; void dijstra(int x) { memset(visit, 0, sizeof(visit)); memset(dist, 0x3f, sizeof(dist));
priority_queue<pII> heap;
二分判定
int left = minv, right = maxv; while (left < right) { int mid = (left +right) / 2; if (check(mid)) left = mid; else right = mid – 1;
}
快速幂运算——递归
int pow(int x, int n) { if (n == 1) return x; else { int t = pow(x, n / 2); t *= t;
相关文档
最新文档