首页 > 其他分享 >模板——图论

模板——图论

时间:2023-04-21 17:58:22浏览次数:34  
标签:nxt 图论 int dep low now inque 模板

缩点(强连通分量)

点击查看代码

const int N=1e5+5,inf=1e9;
vector<int> a[N];
stack<int> stk;
bool vis[N],instk[N];
int dfn[N],low[N],col[N],w[N]; // co:染色结果,w:点权
vector<int> sz; // sz:第i个颜色的点数
int n,m,dcnt;//
void dfs(int x){ // Tarjan求强联通分量
    vis[x]=instk[x]=1; stk.push(x);
    dfn[x]=low[x]=++dcnt;
    for(auto p:a[x]){
        if(!vis[p])dfs(p);
        if(instk[p])low[x]=min(low[x],low[p]);
    }
    if(low[x]==dfn[x]){
        int t; sz.push_back(0); // 记录
        do{
            t=stk.top();
            stk.pop();
            instk[t]=0;
            sz.back()+=w[t]; // 记录
            col[t]=sz.size(); // 染色
        }while(t!=x);
    }
}
void getscc(){
    fill(vis,vis+n,0);
    sz.clear();
    for(int i=1;i<=n;i++) if(!vis[i])dfs(i);
}
struct pii{
    int u,v;
};
void shrink(){ // 缩点,在a里重构
    vector<pii> tmp;
    getscc();
    for(int i=1;i<=n;i++) {
        for (auto j: a[i]) if (col[i] != col[j]) {
                pii u = {col[i], col[j]};
                tmp.push_back(u);
            }
    }
    n=sz.size();
    for(int i=1;i<=n;i++){
        a[i].clear();
        w[i]=sz[i];
    }
    for(auto i:tmp){
        a[i.u].push_back(i.v);
    }
}

最大流+输出方案

点击查看代码

struct FLOW{
    struct edge{int to,w,nxt;};
    vector<edge> a; int head[N],cur[N];
    int n,s,t;
    queue<int> q; bool inque[N];
    int dep[N];
    void ae(int x,int y,int w){ // add edge
        //cout<<"ae:"<<x<<" "<<y<<" "<<w<<endl;
        a.push_back({y,w,head[x]});
        head[x]=a.size()-1;
    }
    bool bfs(){ // get dep[]
        fill(dep,dep+n,inf); dep[s]=0;
        copy(head,head+n,cur);
        q=queue<int>(); q.push(s);
        while(!q.empty()){
            int x=q.front(); q.pop(); inque[x]=0;
            for(int i=head[x];i!=-1;i=a[i].nxt){
                int p=a[i].to;
                if(dep[p]>dep[x]+1 && a[i].w){
                    dep[p]=dep[x]+1;
                    if(inque[p]==0){
                        inque[p]=1;
                        q.push(p);
                    }
                }
            }
        }
        return dep[t]!=inf;
    }
    int dfs(int x,int flow){ // extend
        int now,ans=0;
        if(x==t)return flow;
        for(int &i=cur[x];i!=-1;i=a[i].nxt){
            int p=a[i].to;
            if(a[i].w && dep[p]==dep[x]+1)
                if((now=dfs(p,min(flow,a[i].w)))){
                    a[i].w-=now;
                    a[i^1].w+=now;
                    ans+=now,flow-=now;
                    if(flow==0)break;
                }
        }
        return ans;
    }
    bool is[N];
    void init(int _n){
        n=_n+1; a.clear();
        fill(head,head+n,-1);
        fill(inque,inque+n,0);
        fill(is,is+n,0);
    }
    int solve(int _s,int _t,int _n){ // return max flow
        s=_s,t=_t;
        int ans=0;
        while(bfs()) ans+=dfs(s,inf);
        for(int e=head[s];e>=0;e=a[e].nxt) if(a[e^1].w) is[a[e].to]=1;
        for(int e=head[t];e>=0;e=a[e].nxt) if(a[e].w){
            int v=a[e].to,u=v;
            while(1){
                if(u>=1 && u<=_n && is[u]){
                    is[u]=0;
                    break;
                }
                int w=0,tmp=0;
                for(int i=head[u];i>=0;i=a[i].nxt) if(i&1 && a[i].w){
                    w=a[i].to;
                    tmp=i;
                    break;
                }
                if(!w) break;
                a[tmp].w--;
                u=w;
            }
            //cout<<u<<" "<<v-_n<<endl;
           // fa[find(u)]=find(v-_n);
        }
        return ans;
    }
}flow;
void add(int x,int y,int w){flow.ae(x,y,w),flow.ae(y,x,0);}

标签:nxt,图论,int,dep,low,now,inque,模板
From: https://www.cnblogs.com/szsz/p/17341252.html

相关文章

  • phpStorm自定义快捷键,输出代码块,模板
    在开发过程中经常需要打印数据调试,var_dump()或print_r都没办法直观的查看数据,我一般用如下代码打印数据,但是每次手动输入又麻烦,所以设置一个快捷键就能输出一下代码,岂不是一劳永逸:1.进入设置对话框:File->Setting2.接下自定义快捷键:按一下步骤操作完,点击"ok"键![在这......
  • Gstreamer Pad模板介绍
    Pad模板在GStreamer中,Pad模板(PadTemplate)共有两种类型:静态Pad模板(StaticPadTemplate)和动态Pad模板(DynamicPadTemplate)。静态Pad模板是在元素的代码中预定义的,它描述了Pad的名称、方向、数据类型、标识符和其他属性。静态Pad模板用于描述元素的固有能力,因此在......
  • 在线简历制作模板
    分享两个比较好的在线简历制作模板: 链接:https://www.resumeis.com/home极简:链接地址:https://www.polebrief.com/edit......
  • 一维与二维前缀和(蓝桥杯复习+例题讲解+模板c++)
    文章目录前缀和二维前缀和总结3956.截断数组99.激光炸弹前缀和前缀和是一种常见的算法,用于快速计算数组中某一段区间的和。前缀和的思想就是预处理出数组中前缀和,然后用后缀和减去前缀和,即可快速计算区间和。以一维数组为例,设表示数组中第个元素的值,表示数组中前个元素的......
  • 单调队列(例题详解+模板cpp)
    有一类问题需要维护一段区间内的最大值或最小值,例如滑动窗口、区间最值等问题。一般情况下,我们可以使用线段树、ST表等数据结构来解决这类问题,但是这些数据结构的实现较为复杂,需要一定的时间和精力来学习和掌握。而单调队列则是一个简单而高效的数据结构,可以用来解决这类问题。基本......
  • Trie字典树(例题详解+模板cpp)
    字典树(Trie树)一:概念字典树是一种树形结构,用于存储一组字符串,支持快速的字符串查找和前缀匹配。字典树的本质是利用字符串之间的公共前缀,将具有相同前缀的字符串合并在一起,从而实现高效的字符串操作。数据结构字典树是一棵多叉树,每个节点包含若干个指向子节点的指针,每个节点代表一......
  • 图的最短路问题(综合详解!!!看这一篇就够了)(spfa-Dijkstra-floyd-模板代码c-)
    文章目录图论:三种最短路及模板模板SPFA算法Floyd算法Dijkstra算法例题与应用反向建边最短路计数1488.最短距离3305.作物杂交4074.铁路与公路图论:三种最短路及模板注意:在这三种算法中我均使用的链式前向星存图,具体方式请看我这篇博客:链式前向星存图详解模板SPFA算法spfa是优化......
  • bfs与dfs详解(经典例题 + 模板c-代码)
    文章目录模板+解析dfsbfs1562.微博转发3502.不同路径数165.小猫爬山模板+解析DFS(深度优先搜索)和BFS(广度优先搜索)是图论中两个重要的算法。dfs其中DFS是一种用于遍历或搜索树或图的算法,BFS则是一种用于搜索或遍历树或图的算法。两种算法都有其自身的优点和缺点,应用于不同的场景中......
  • 最小生成树详解-模板
    概念最小生成树的定义在一张带权无向图中,最小生成树是一棵生成树,它的边权值之和最小。生成树是一颗包含原图中所有顶点的树,它的边集合是原图的一个子集,且任意两个顶点之间都有且仅有一条简单路径。最小生成树的算法目前,最常用的两种最小生成树算法是Kruskal算法和Prim算法。Kruska......
  • 二分查找例题与模板(蓝桥杯复习+例题讲解+模板c++)
    文章目录二分模板1460.我在哪?102.最佳牛围栏113.特殊排序二分模板本文所使用的二分模板都是确保最终答案落在[L,R]以内,循环以L==R结束,每次二分的中间值会使mid成为左右区间的二者之一。单调递增序列找大于等于x的最小的值:区间的划分[l,mid][mid+1,r]while(l<r){ intmid......