Home avatar

时光似海

网络流

bfs找路,途中记录前驱节点

让后从汇点遍历到起点,找到最小flow

再次遍历,更新沿途边

累加答案,继续bfs

#define mem(x,y) memset(x,y,sizeof(x))
#define SIZE 1005
const int INF=0x3f3f3f3f;
int G[SIZE][SIZE],pre[SIZE];
bool vst[SIZE];
bool bfs(int s,int t){
    queue<int> que;
    mem(vst,0);
    mem(pre,-1);
    pre[s]=s;
    vst[s]=true;
    que.push(s);
    while (!que.empty()) {
        int u=que.front();que.pop();
        for(int i=s;i<=t;++i){//遍历所有点
            if(G[u][i]&&!vst[i]){
                pre[i]=u;
                vst[i]=true;
                if(i==t)return true;
                que.push(i);
            }
        }
    }
    return false;
}
int EK(int s,int t){
    int ans=0;
    while (bfs(s,t)) {
        int minflow=INF;
        for(int i=t;i!=s;i=pre[i]){
            minflow=min(minflow,G[pre[i]][i]);
        }
        for(int i=t;i!=s;i=pre[i]){
            G[pre[i]][i]-=minflow;
            G[i][pre[i]]+=minflow; // 一定记得反向边
        }
        ans+=minflow;
    }
    return ans;
}

多路增广+当前弧优化

链式前向星

链式前向星,存图方法

#include <string.h> /*for memset*/

//最大顶点数与最大边数
const int V=100;
const int E=100;

//边结构体定义
struct Edge{
    int to;   // 这条边的另一个顶点
    int next; // 指向下一条边的数组下标,-1为不存在;
    int len;  // 权值
};

//head[i] 表示顶点i的边的数组下标,-1表示无边;
int head[V];//第一条边
Edge edge[E];

//链式前向星初始化,之初始化顶点数组
void init(){
    memset(head, -1, sizeof(head));
}

//增加边的方式
//加入a—>b,权值l;
int id;
inline void AddEdge(int a,int b,int l=0){
    edge[id].to=b;
    edge[id].next=head[a]; //和下面一行将新边作为a的第一条边;
    head[a]=id;
    edge[id].len=l;
    id++;//只给edge数组开新空间用
}

//遍历从a出发的边 得到下一个点和权值
for(int i=head[a];i!=-1;i=edge[i].next){
    //edge[i] 即为当前边
}

MySQL操作手册(个人笔记)

此文为个人笔记,大学时候的总结难免有错,不代表本人目前水平[手动doge] (by 2021)

本来这总结已经被我从网络上删除了,看在可能是本文迄今为止唯一读者老田园的份上重新发布,方便老人查阅。

背包问题

n种物品,一个承重量为m的背包,每种物品最多只能拿一个或者不拿,且每个物品都有价值v[i]和重量w[i],问怎么拿使背包内物品价值最大。

定义dp[i][j]表示走到第i个物品,背包重量为j时的价值。

转移方程dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + v[i])

dp[i-1][j]表示不拿当前物品,背包重量为j时的价值

RMQ区间最值查询

RMQ区间最值查询,对于长度为n的数组A[]

RMQ(i,j),返回数组A区间[i , j]内的最大值或最小值。

(线段树也是可以的

ST算法:

O(nlogn)预处理,O(1)查询

kmp

KMP最小循环节、循环周期:

定理:假设S的长度为len则S存在最小循环节,对S构造next数组,循环节的长度Llen-next[len],子串为S[0…len-next[len]-1]。