经典代码小集
范晓天
给我一片蓝天,让我飞得更高……
展开
-
强连通分量(POJ 2186 Popular Cows)
<br />/* <br /> * File: PKU 2186 Popular Cows<br /> * Author: xiaotian @ hnu<br /> * Created on 2010年10月6日, 上午9:50<br /> * 题解:求强连通分量、缩点。<br /> * 检查出度为0的“点”的个数,这里的点指的是每一个强连通分量<br /> * 当出度为 0 “点”的个数仅为 1 时输出该联通分量里的点的个数<br /> * 否则输出 0 。<br />原创 2010-10-06 10:56:00 · 287 阅读 · 0 评论 -
Timus 1069. The Prufer code
<br /> * File: Timus 1069. The Prufer code<br /> * Author: xiaotian @ hnu<br /> * Created on 2010年10月9日, 上午9:35<br /> * 题解:思维题目。给定一棵树的编码方式,让还原这棵树。<br /> * 编码方式:每次取编号最小的叶节点和与其相连的边删掉,写下这个叶节点的父亲节点。重复以上操作,直到只有一个节点的时候,这个节点编号必然是 n 。<br /> * 还原方式:可以发现原创 2010-10-09 10:25:00 · 354 阅读 · 0 评论 -
HNU 10862 Ticket to Ride
<br />所谓最小斯泰纳树,很裸,直接套版<br /> <br />/* * File: HNU 10862 Ticket to Ride * Author: xiaotian @ hnu * Created on 2010年10月6日, 下午7:48 * 题解:最小斯泰纳树,直接套板 */ #include<stdio.h> #include<iostream> #include<string> #include<queue> #include<map> #incl原创 2010-10-06 20:49:00 · 394 阅读 · 1 评论 -
最短路计数
<br />#include<stdio.h> #include<iostream> #include<string.h> #include<queue> #include<set> #include<math.h> using namespace std; #define N 1008 #define inf 0x7ffffff struct node { int e, d; node(int a, int b) : e(a), d(b) {} bool o原创 2010-10-08 10:50:00 · 386 阅读 · 0 评论 -
Dinic 数组实现
<br />int g[N][N]; /*剩余流*/ bool vis[N]; /*标记数组*/ int level[N]; int n, m; /*顶点数,边数*/ int src, sink; /*scr源 sink汇*/ int build(){ /* 建图 */ } int find(int x) { for (int i = 1; i <= n; i++) { if (g[x][i] != 0 && level[i] == level[x] +原创 2010-10-09 12:17:00 · 269 阅读 · 0 评论 -
Dinic 邻接表实现
<br />/* Dinic最大流 O(V^2 * E) INIT: ne=2; head[]置为0; addedge()加入所有弧; CALL: flow(n, s, t); */ #define typec int // type of cost struct edge { int x, y, nxt; typec c; } bf[E]; int ne, head[N], cur[N], ps[N], dep[N]; void addedge(int x, int y,原创 2010-10-09 12:50:00 · 461 阅读 · 0 评论 -
HDU 2485 Destroying the bus stations
<br />网络流 <br /> <br />要求割点的数量,可以转化为求割边的数目,即拆点。<br /> <br />先bfs两次,求出起点和终点到其余各点的距离。然后将每个点拆成两个点,容量为 1 。如果dist1[i]+dist2[j]<k,则给 i' 和 j 连一条边,容量为 1 。<br /> <br />最后求最大流,就是答案。<br /> <br />/* * File: HDU 2485 Destroying the bus stations * Author: xiaotia原创 2010-10-10 19:13:00 · 1078 阅读 · 0 评论 -
2-sat 模板
<br />/* * File: 2-sat 模板 * Author: xiaotian @ hnu * Created on 2010年10月11日, 上午9:52 * 题解:2-sat问题求解 * 建图:将每一个点拆成 p 和 p'(编号时 p'=p+n ) * 如果 ap 和 bp 矛盾,则添加边:(ap,bp'),(bp,ap'). */ #include<stdio.h> #include<iostream> #include<string.h> #incl原创 2010-10-11 13:28:00 · 1276 阅读 · 0 评论 -
ZOJ 2314 Reactor Cooling
<br />无源汇上下界可行流<br /><br /><br />这算是上下界网络流问题里最简单的了吧。<br /><br /><br />做法:添加源点 s 和汇点 t 。<br />拆边,对于边(u,v,b,c),添边:(u,v,c-b),(s,v,b),(u,t,b)。<br />求 s 到 t 的最大流,若 maxflow==sigma(bi) 则有解,否则无解。<br /> <br />#include<stdio.h> #include<iostream> #include<string.原创 2010-10-18 21:06:00 · 444 阅读 · 0 评论 -
ZJU 3362 Beer Problem
/* * File: ZJU 3362 Beer Problem * Author: xiaotian @ hnu * Created on 2010年10月30日, 下午12:05 * 解题: */ #include #include #include #include using namespace std; const int N = 105; const int E = 8100; const int inf = 0x7ffffff; int minc原创 2010-10-30 12:27:00 · 333 阅读 · 0 评论 -
最大流 FF 模板
#define N 205 #define inf 0x7fffff int edge[N][N]; int chk[N],n; int father[N]; int Ford_Fulkerson() { while(1) { queue q; memset(chk,0,sizeof(chk)); memset(father,-1,sizeof(father)); int now; chk[0]=1; q.push(0);原创 2010-10-09 12:52:00 · 407 阅读 · 0 评论 -
PKU 2377 Bad Cowtractors
<br /> <br />最大生成树<br /> <br />最大生成树/* * File: PKU 2377 Bad Cowtractors * Author: xiaotian @ hnu * Created on 2010年10月8日, 上午11:10 * 题解:最大生成树 */ #include<stdio.h> #include<iostream> #include<string.h> #include<queue> #include<map> #includ原创 2010-10-08 12:25:00 · 408 阅读 · 0 评论 -
强连通分量 tarjan 模板
/*Tarjan强连通分量 INIT: g[]为邻接表; stop, cnt, scnt置0; pre[]置-1; CALL: for(i=0; i g[N]; int id[N], pre[N], low[N], s[N], stop, cnt, scnt; void tarjan(int v, int n) // vertex: 0 ~ n-1 { int t, minc = low[v] = pre[v] = cnt++; s[stop++] = v; for原创 2010-10-06 10:59:00 · 573 阅读 · 0 评论 -
Dancing Links 精确覆盖模板
Dancing Links 精确覆盖模板#include #include #include #include #include #define inf 0x3fffffff using namespace std; const int N = 305; /*列数*/ const int M = 4000; /*点数*/ int map[N][N]; /* 01矩阵表 */ int U[M], D[M], R[M], L[M], rs[N]; int size[N], head, r原创 2010-10-02 11:43:00 · 786 阅读 · 0 评论 -
最短路 dijkstra 优先队列优化
<br /> <br />Dijkstra O(E * log E)<br /> <br />/* Dijkstra O(E * log E) INIT: 调用init(nv, ne)读入边并初始化; CALL: dijkstra(n, src); dist[i]为src到i的最短距离 */ int cost[E], dist[V]; int e, pnt[E], nxt[E], head[V], prev[V], vis[V]; struct qnode { int v; i原创 2010-10-04 10:50:00 · 745 阅读 · 0 评论 -
BellmanFord 单源最短路
BellmanFord单源最短路/*BellmanFord单源最短路O(VE) | 能在一般情况下,包括存在负权边的情况下,解决单源最短路径问题 | INIT: edge[E][3]为边表 | CALL: bellman(src);有负环返回0;dist[i]为src到i的最短距 | 可以解决差分约束系统: 需要首先构造约束图,构造不等式时>=表示求最小值, 作为最长路, dist[u] + c) { pre[v] = u; return 1; }原创 2010-10-04 11:00:00 · 252 阅读 · 0 评论 -
闲话最小生成树
<br />最小生成树,什么是最小生成树?<br /><br /> 比较官方的定义:设G=(V,E)是一个无向连通带权图,即一个网络。E中每条边(u,v)的权为cost。如果G的子图G‘是一棵包含G的所有顶点的树,则称G’为G的生成树。生成树上边权总和为该生成树的耗费。在G的所有生成树中,耗费最小的即为G的最小生成树。<br /><br /> 简单的说:一个连通图中,用花费最少的边使得该图依然连通。<br /><br /> 解决最小生成树问题,是一个经典的贪心过程。通常有两种算法<br /><br /原创 2010-10-05 11:01:00 · 281 阅读 · 0 评论 -
Dancing Links 重复覆盖模板
<br />Dancing Links 重复覆盖模板<br /> <br />#include<iostream> #include<cstdio> #include<string.h> #include<vector> #include<math.h> #define inf 0x3fffffff using namespace std; const int N = 1005; const int M = 4000; int U[M], D[M], R[M], L[M], rs[N];原创 2010-10-02 16:38:00 · 899 阅读 · 0 评论 -
spfa 差分约束
<br />spfa 差分约束<br /> <br />/* spfa 差分约束 首先构造约束图,构造不等式时>=表示求最小值, 作为最长路,<=表示求最大值, 作为最短路 (v-u <= c:a[u][v] = c) 用addedge加如所有的边 返回0表示无解,返回1表示有可行解,可行解存在 dis 数组里 */ bool vis[N]; int cnt[N],dis[N],head[N]; int V[E], next[E]; int W[E]; int ne, n, m; void原创 2010-10-04 11:19:00 · 299 阅读 · 0 评论 -
最大团模板
<br />最大团模板<br /> <br />void clique(int n, int* u, int mat[][MAXN], int size, int& max, int& bb, int* res, int* rr, int* c) { int i, j, vn, v[MAXN]; if (n) { if (size + c[u[0]] <= max) return; for (i = 0; i < n + size - max && i原创 2010-10-02 16:51:00 · 362 阅读 · 0 评论 -
最短路 dijkstra 数组实现
<br />最短路 dijkstra 数组实现<br />/* Dijkstra数组实现O(N^2) Dijkstra --- 数组实现(在此基础上可直接改为STL的Queue实现) g[][] --- 邻接阵,i 到 j 的初始距离 dist[] --- beg到其他点的最近距离 path[] --- beg为根展开的树,记录父亲结点 */ #define INF 0x7ffffff #define N 1008 int path[N], vis[N]; int g[N][N], dis原创 2010-10-04 10:42:00 · 546 阅读 · 1 评论 -
PKU 2449 Remmarguts' Date(第 k 短路模板)
<br /> PKU 2449 Remmarguts' Date<br /> <br />/* * File: PKU 2449 Remmarguts' Date * Author: xiaotian @ hnu * Created on 2010年10月5日, 上午10:25 * 题解:求第 k 短路,dijkstra + A* 搜索 */ #include<iostream> #include<stdio.h> #include<string.h> #include<q原创 2010-10-05 10:42:00 · 1068 阅读 · 2 评论 -
ZOJ 3059 Die Board Game
<br />/*<br /> * File: ZOJ 3059 Die Board Game<br /> * Author: xiaotian @ hnu<br /> * Created on 2010年11月2日, 上午9:26<br /> * 解题:骰子宽搜索问题,写的猥琐了一点,手动打表量很少。<br /> * 一般情况下骰子的两个相邻的面确定一个状态,再加上位置(x,y)就是三维的状态<br /> * 状态空间为 N*M*24 ,实际上开的是 N*M*36 的数组<br原创 2010-11-02 17:01:00 · 614 阅读 · 0 评论