`
yzmduncan
  • 浏览: 330390 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

最小点割集(点连通度)

阅读更多


      无向(有向)图G中,给定源点s和终点t,至少要删去多少个点(具体一点,删哪些点),使得s和t不连通。这个问题就是点连通度,也叫最小点割集

     一般最小点割转化到最小边割上,将原图中的点v拆成v'和v'',且w(v,v'')=1。对于原图中的有向边(u,v),则有w(u'',v')=INF;若是无向边,则还要加上边:w(v'',v')=INF。然后求以s''为源点,t'为汇点的最大流。maxflow即为最少需要删的点数,割边集对应了具体删的点的一组解

     值得注意的是最小点割的解有很多,如下图:



 

 

     最小点割的方案有4种:(4,3),(4,1),(2,3),(2,1)。若按上述方法求解,最小割点集为(4,3)。

 

例:POJ1815

     题意:给出一个图,问要删去多少个点,才能使得从1到不了n。显然这是个最小点割问题。但题目又要求,如果有多种方案,输出序号最小的一种。

     解:显然,如果s和t直接相连,则无解。求最小点割集方法并不难,取割边集即可,关键是如何满足题意"序号最小的一种"。有一种简单的贪心:从2到n-1枚举删除每一个点,看删除之后流量是否发生变化,若变化,则这点就算在解中;否则恢复这个点。过程一直进行到maxflow=0为止。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int INF = 0x7fffffff;
const int maxv = 410;
const int maxe = maxv*maxv*10;
int n;
int g[205][205];
struct Edge
{
    int v;
    int next;
    int flow;
};
Edge e[maxe];
int head[maxv],edgeNum;
int now[maxv],d[maxv],vh[maxv],pre[maxv],preh[maxv];
int result[maxv];
bool cut[maxv];

void addEdge(int a,int b,int c)
{
    e[edgeNum].v = b;
    e[edgeNum].flow = c;
    e[edgeNum].next = head[a];
    head[a] = edgeNum++;
    e[edgeNum].v = a;
    e[edgeNum].flow = 0;
    e[edgeNum].next = head[b];
    head[b] = edgeNum++;
}

void Init()
{
    edgeNum = 0;
    memset(head,-1,sizeof(head));
    memset(d,0,sizeof(d));
}

int sap(int s,int t,int n)       //源点,汇点,结点总数
{
    int i,x,y;
    int f,ans = 0;
    for(i = 0; i < n; i++)
        now[i] = head[i];
    vh[0] = n;
    x = s;
    while(d[s] < n)
    {
        for(i = now[x]; i != -1; i = e[i].next)
            if(e[i].flow > 0 && d[y=e[i].v] + 1 == d[x])
                break;
            if(i != -1)
            {
                now[x] = preh[y] = i;
                pre[y] = x;
                if((x=y) == t)
                {
                    for(f = INF,i=t; i != s; i = pre[i])
                        if(e[preh[i]].flow < f)
                            f = e[preh[i]].flow;
                    ans += f;
                    do
                    {
                        e[preh[x]].flow -= f;
                        e[preh[x]^1].flow += f;
                        x = pre[x];
                    }while(x!=s);
                }
            }
            else
            {
                if(!--vh[d[x]])
                    break;
                d[x] = n;
                for(i=now[x]=head[x]; i != -1; i = e[i].next)
                {
                    if(e[i].flow > 0 && d[x] > d[e[i].v] + 1)
                    {
                        now[x] = i;
                        d[x] = d[e[i].v] + 1;
                    }
                }
                ++vh[d[x]];
                if(x != s)
                    x = pre[x];
            }
    }
    return ans;
}

void makeGraph()
{
    int i,j;
    Init();
    for(i = 1; i <= n; i++)
    {
        for(j = 1; j <= n; j++)
        {
            if(g[i][j])
            {
                addEdge(i+n,j,INF);
                addEdge(j+n,i,INF);
            }
        }
    }
    for(i = 1; i <= n; i++)
    {
        if(!cut[i])
            addEdge(i,i+n,1);
        else
            addEdge(i,i+n,0);
    }
}

int main()
{
    int i,j;
    int s,t;
    scanf("%d %d %d",&n,&s,&t);
    memset(cut,0,sizeof(cut));
    for(i = 1; i <= n; i++)
        for(j = 1; j <= n; j++)
            scanf("%d",&g[i][j]);
    if(g[s][t])
    {
        printf("NO ANSWER!");
        return 0;
    }
    makeGraph();
    int flow = sap(s+n,t,2*n);
    printf("%d\n",flow);
    int cnt = 0;
    for(i = 1; i <= n && flow; i++)
    {
        if(i==s||i==t)
            continue;
        cut[i] = true;
        makeGraph();
        if(sap(s+n,t,2*n) == flow-1)
        {
            flow--;
            result[cnt++] = i;
        }
        else
            cut[i] = false;
    }
    for(i = 0; i < cnt; i++)
        printf("%d ",result[i]);
    printf("\n");
    return 0;
}

 

 

  • 大小: 10.6 KB
分享到:
评论

相关推荐

    点割集、边割集、割点、桥、连通度、双连通分支定义1

    在图的分析中,点割集、边割集、割点、桥、连通度和双连通分支是关键概念,它们帮助我们理解图的结构特性。 1. **点割集**: 点割集V是图G中的一组顶点,当这些顶点及其关联的边被删除时,会导致图G不连通。但若仅...

    图的代数连通度及其点连通度 (2003年)

    G是一个简单图。a(G),k(G)分别为G的代数连通度和点连通度,该文刻画了满足a(G)=k(G)的图。G=(V,E)是一个n阶简单图,点连通度为k(G)≤n/2。H是G的任一最小点割集,则a(G)=k(G)当且仅当对任意u∈H和v∈VH,有uv∈E。

    图论讲义(树 图 连通度 最小生成树)

    - **连通度(Connectivity)**:衡量图的连通强度的指标,对于无向图,连通度是指在图中至少需要移除多少个顶点才能使图变得不连通。 #### 4. 匹配问题 - **匹配(Matching)**:图中一组互不相邻的边的集合。 - **...

    离散数学图论习题课PPT学习教案.pptx

    节点的连通度k(G)和边的连通度λ(G)分别表示最小点割集和最小边割集的大小。 3. **图的矩阵表示**:无向图的邻接矩阵记录了节点间的边关系,可用于计算节点度数。有向图的可达矩阵表示节点间是否存在路径,而关联...

    Cutsets and Hamiltonian cycles of Johnson graphs

    Johnson图的一些基本参数已经被讨论过,比如Johnson图的连通度是k(n-k),直径是k,以及宽直径是k+1,它的色数小于n。 接下来,局部割集是与图中某个顶点相关的一个概念。对于图G中的一个顶点v,顶点v的一个局部割集...

    计算机数学基础教案(6).pdf

    - 点割集是无向连通图中的一组顶点,移除后导致图不再连通,且任何真子集都无法达到相同效果。割点是点割集中仅包含一个顶点的情况。 - 边割集是无向连通图中的一组边,移除后导致图不再连通,且任何真子集都无法...

    3-正则图的1-因子与割边数

    对于3-正则图,作者通过度和定理推导出,去掉一个顶点集后,与该顶点集相关联的奇连通分支数总是与该顶点集的大小相同或者是其奇数倍。这一点在分析图是否具有1-因子时起到了关键作用。 本文的工作得到了高校优秀...

    集图09期末试卷1

    7. 图的子结构:第七题要求在给定的图中找出最大匹配、最大独立集、最小点覆盖、最小支配集以及极大路径。这些子结构是图论中的核心概念,它们在图的优化问题中有广泛应用。 8. 二部图的性质:最后一题证明了在二部...

    ACM 算法模板集

    ACM 算法模板集 ...32. 二分图最小点权覆盖 33. 带约束的轨道计数(Burnside引理) 34. 三分法求函数波峰 35. 单词计数,矩阵乘法 36. 字符串和数值hash 37. 滚动队列,前向星表示法 38. 最小点基,最小权点基

    ACM模板(吉林大学)

    - 点连通度是指图中最小点割集的大小。这部分内容讨论了如何求解最小点割集。 - **最小路径覆盖O(N^3)** - 最小路径覆盖是指在图中寻找最少数量的路径覆盖所有顶点。这部分介绍了如何求解最小路径覆盖问题。 - *...

    吉林大学ACM代码库全集(.pdf)

    - **最佳边割集/最佳点割集/最小边割集/最小点割集**:分别讨论了如何寻找最优的边割集和点割集。 - **最小路径覆盖O(N^3)**:介绍了如何求解最小路径覆盖问题。 - **最小点集覆盖**:探讨了如何找到覆盖图中所有边...

    离散数学期末考试题-09-10-2-A-信科-试题.pdf

    10. 图的点连通度与边连通度:点连通度κ(T)是图T中最小点割集的大小,边连通度λ(T)是图T中最小边割集的大小。最小度δ(T)是图中所有顶点的最小度,最大度Δ(T)是图中所有顶点的最大度。一般而言,κ(T)≤λ(T)≤δ...

    离散数学图论部分经典试题及答案.doc

    3. **点割集和割点**:点割集是图中的一组顶点,如果移除这组顶点及其相关的边,图不再连通,那么这组顶点是点割集,而这些顶点是割点。例如,e 是割点,而 {b, e} 是点割集。 4. **强连通图**:在有向图中,如果图...

    图论习题集

    ### 图论习题集知识点详解 #### 图论基础与网络流概述 本习题集主要围绕图论的基础概念以及网络流问题展开,旨在通过一系列练习加深读者对这些知识点的理解。 ### 图论基础知识 #### 图的基本定义 - **无向图**...

    ACM/ICPC常用算法的代码库(吉林大学版,强烈推荐)

    - **最小点割集(点连通度)**:计算图的点连通度,即最小点割数。 - **最小路径覆盖O(N^3)**:在有向图中寻找最少数量的路径覆盖所有节点。 - **最小点集覆盖**:在图中寻找覆盖所有边的最小点集。 #### Structure...

    2019秋 图论期末考试1

    - **最大点连通度**:在无向图中,最大点连通度是指图中任意两个顶点间至少存在多少条独立路径。对于有v个顶点的图,最大点连通度可以是v-1,这种情况出现在完全图中,每对顶点之间都有一条边。 - **最大边连通度*...

    连通度与强正则图的2-可扩性 (1993年)

    - **圈边连通度**(\( c\lambda(G) \)):定义为图\( G \)中的最小圈边割集的大小。一个圈边割集是指在去除这些边后,图中至少存在两个组成部分,每个部分都包含至少一个环。 - **图的\( n \)-可扩性**:若图\( G \)...

    ACM/ICPC算法大全(c语言)

    - **最小点割集(点连通度)** - 最小点割集是指从图中移除最少数量的顶点以使图分离为两个部分。 - **最小路径覆盖O(N^3)** - 最小路径覆盖是指在图中找到一组互不相交的路径,覆盖所有顶点。 - **最小点集覆盖...

Global site tag (gtag.js) - Google Analytics