字符串
KMP算法
int nextTable[MAXM];
int pattern[MAXM];
int text[MAXN];
void getNextTable(int m) {
int i = 0, j = -1;
nextTable[i] = j;
while(i < m) {
if(j == -1 || pattern[i] == pattern[j]) {
i++;
j++;
nextTable[i] = j;
}
else {
j = nextTable[j];
}
}
}
int KMP(int n, int m) {
getNextTable(m);
int i = 0, j = 0;
while(i < n && j < m) {
if(j == -1 || text[i] == pattern[j]) {
i++;
j++;
}
else {
j = nextTable[j];
}
}
if(j == m) {
return i - j + 1;
}
else {
return -1;
}
}
图论
并查集
int parent[MAXN];
int height[MAXN];
void init(int n) {
for(int i=0; i<=n; i++) {
parent[i] = i;
height[i] = 0;
}
}
int find(int x) {
if(x != parent[x]) {
parent[x] = find(parent[x]);
}
return parent[x];
}
void uni(int x, int y) {
x = find(x);
y = find(y);
if(x != y) {
if(parent[x] < parent[y]) {
parent[x] = y;
}
else if(parent[x] > parent[y]) {
parent[y] = x;
}
else {
parent[y] = x;
height[x]++;
}
}
}
最小生成树
Kruskal
struct Edge {
int from;
int to;
int length;
bool operator< (const Edge& e) const {
return length < e.length;
}
};
Edge edge[MAXN*MAXN];
int parent[MAXN];
int height[MAXN];
void init(int n) {
for(int i=0; i<=n; i++) {
parent[i] = i;
height[i] = 0;
}
}
int find(int x) {
if(x != parent[x]) {
parent[x] = find(parent[x]);
}
return parent[x];
}
void uni(int x, int y) {
x = find(x);
y = find(y);
if(x != y) {
if(height[x] < height[y]) {
parent[x] = y;
}
else if(height[x] > height[y]) {
parent[y] = x;
}
else {
parent[y] = x;
height[x]++;
}
}
}
int Kruskal(int n, int edgeNumber) {
init(n);
sort(edge, edge + edgeNumber);
int sum = 0;
for(int i=0; i<edgeNumber; i++) {
Edge current = edge[i];
if(Find(curren.from) != Find(current.to)) {
uni(current.from, current.to);
sum += current.length;
}
}
return sum;
}
最短路径
Dijkstra
struct Edge {
int to;
int length;
Edge(int t, int l): to(t), length(l) {}
}
struct Point {
int number;
int distance;
Point(int n, int d): number(n), distance(d) {}
bool operator< (const Point& p) const {
return distance > p.distance;
}
}
vector<Edge> graph[MAXN];
int dis[MAXN];
void Dijkstra(int s) {
priority_queue<Point> q;
dis[s] = 0;
q.push(Point(s, dis[0]));
while(!q.empty()) {
int u = q.top().number;
q.pop();
for(int i=0; i<graph[u].size(); i++) {
int v = graph[u][i].to;
int d = graph[u][i].length;
if(dis[v] > dis[u] + d) {
dis[v] = dis[u] + d;
q.push(Point(v, dis[v]));
}
}
}
}
拓扑排序
vector<int> graph[MAXN];
itn inDegree[MAXN];
bool TopologicalSort(int n) {
queue<int> node;
for(int i=0; i<n; i++) {
if(inDegree[i] == 0) {
node.push(i);
}
}
int number = 0;
while(!node.empty()) {
int u = node.front();
node.pop();
number++;
for(int i=0; i<graph[u].size(); i++) {
int v = graph[u][i];
inDegree[v]--;
if(inDegree[v] == 0) {
node.push(v);
}
}
}
return n == number;
}
关键路径
struct Edge {
int to;
int length;
Edge(int t, int l): to(t), length(l) {}
};
vector<Edge> graph[MAXN];
int earliset[MAXN];
int latest[MAXN];
int inDegree[MAXN];
int CriticalPath(int n) {
vector<int> topology;
queue<int> node;
for(int i=0; i<n; i++) {
if(inDegree[i] == 0) {
node.push(i);
earliest[i] = 1;
}
}
int totalTime = 0;
while(!node.empty()) {
int u = node.front();
topology.push_back(u);
node.pop();
for(int i=0; i<graph[u].size(); i++) {
int v = graph[u][i].to;
int l = graph[u][i].length;
earliest[v] = max(earliest[v], earliest[u] + l);
inDegree[v]--;
if(inDegree[v] == 0) {
node.push(v);
totalTime = max(totalTime, earliest[v] + l);
}
}
}
for(int i=topology.size()-1; i>=0; i--) {
int u = topology[i];
if(graph[u].size() == 0) {
latest[u] = earliest[u];
} else {
latest[u] = INF;
}
for(int j=0; j<graph[u].size(); j++) {
int v = graph[u][j].to;
int l = graph[u][j].length;
latest[u] = min(latest[u], latest[j] - l);
}
}
return totalTime;
}