• 图论——最大流(DINIC)


    最大=最小割=最小点权覆盖集=sum-最大点权独立集


    #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define INF 0x3f3f3f3f using namespace std; int dis[300];//BFS深度int q[30000],h,r;//BFS队列 int e;//终点 int head[300];//邻接表头指针 int current[300];//当前弧优化struct edge { int to,v; int next; }E[333333]; int tot; void addedge(int a,int b,int v) { E[tot].to = b; E[tot].v = v; E[tot].next = head[a]; head[a] = tot++; E[tot].to = a; E[tot].v = 0; E[tot].next = head[b]; head[b] = tot++; } void init() { memset(E,0,sizeof(E)); memset(head,-1,sizeof(head)); tot = 0; } int BFS(int b) { int u; memset(dis,-1,sizeof(dis)); dis[b] = 0; h = 0; r=1; q[1] = b; while(h < r) { u = q[++h]; for (int i = head[u]; i!=-1;i = E[i].next) { int v = E[i].to; if (dis[v] < 0&&E[i].v > 0) { dis[v] = dis[u]+1; q[++r] = v; } } } if (dis[e]>0) return 1; else return 0; } int dinic(int x ,int low) { int i,a = 0; if (x==e) return low; for (i = current[x]; i !=-1 ; i = E[i].next) { current[x] = i; int v = E[i].to; if (E[i].v > 0&&dis[v]==dis[x]+1 && (a=dinic(v,min(low,E[i].v)))) { E[i].v -= a; E[i^1].v += a; return a; } } return 0; } int main() {
    int t;int ANS; init();
    int b = ?//起点main局部变量
    e = ?//全局变量
    int tans;
    while(BFS(b)) { for (int i = 0; i<=e;i++) current[i] = head[i]; while (tans = dinic(b,0x3f3f3f3f)) ANS+=tans; }
    cout << ANS <<endl; return 0; }
  • 相关阅读:
    2、成员对象与封闭类(类与类之间的关系——复合)
    3、常量成员函数
    4、友元
    1、this指针与静态成员
    模拟标准库vetor类写一个简易的变长整数型数组
    运算符重载为友元函数
    左值和右值
    浅拷贝和深拷贝
    赋值运算符
    函数的返回值是如何回到调用处的?
  • 原文地址:https://www.cnblogs.com/HITLJR/p/5815945.html
Copyright © 2020-2023  润新知