二分最大匹配,为后面的km算法做准备

 1 int n, m;
 2 bool b[100];
 3 int v[100];
 4 vector<int>e[100];
 5 bool find(int x){
 6     b[x] = true;
 7     for (int a : e[x]){
 8         if (!v[a] || (!b[v[a]] && find(v[a]))){
 9             v[a] = x;
10             return true;
11         }
12     }
13     return  false;
14 }
15 int match(){
16     int ret = 0;
17     for (int i = 1; i <= n; ++i){
18         memset(b, 0, sizeof(b));
19         if (find(i)){
20             ret++;
21         }
22     }
23     return ret;
24 }//二分图求最大匹配数

树状数组,一种比较快速求和,单点更改的数据结构

 1 ll c[N];
 2 ll query(int x){
 3     ll ret = 0;
 4     for (; x>0; x -=x&(-x)){
 5         ret += c[x];
 6     }
 7     return ret;
 8 }//查询到下标x的前缀和
 9 void modify(int x, ll y){
10     for (; x <=n; x += x&(-x)){
11         c[x] += y;
12     }//下标x更改y
13 }//树状数组