`
yzmduncan
  • 浏览: 327072 次
  • 性别: 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

    点割集:V是一些顶点的集合,如果删除V中的所有顶点之后,G不再连通,但是对于V的任何真子集V1,删除V1后G仍然连通,则称V是点割集。边割集:E是一些边的集合,

    计算网络节点模块内连通度和模块间连通度

    计算网络节点模块内连通度和模块间连通度是复杂网络分析的重要组成。我们可以通过分析节点的模块内连通度和模块间连通度来对节点的重要性进行度量,具有较低的模块内连通度和模块间连通度的节点的重要性则相对较低。

    割顶,割边,连通分支割顶,割边,连通分支

    割顶,割边,连通分支割顶,割边,连通分支割顶,割边,连通分支割顶,割边,连通分支割顶,割边,连通分支割顶,割边,连通分支割顶,割边,连通分支割顶,割边,连通分支割顶,割边,连通分支割顶,割边,连通分支...

    图的代数连通度及其点连通度 (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。

    论文研究-基于连通度的Adhoc网络路由协议研究与仿真.pdf

    目前的度量标准主要集中在吞吐量、延时、抖动、丢包率等QoS因子或路由负载、寻路时间等外部特性上,还没有以Ad hoc网络系统本身的连通度作为度量标准进行仿真,评价各种路由协议在不同试验条件下对于同一网络系统...

    论文研究-基于网络拓扑图的树的代数连通度.pdf

    代数图谱理论方法在网络...采用移接变形方法,讨论了树的代数连通度和直径之间的关系,获得了下面的结论:当树的顶点数固定时,树的代数连通度随着树的直径的增加而减少。进一步地,讨论了树的代数连通度的上界和下界。

    ch3连通度1

    第三章连通度问题第三章连通度问题3.1 连通度3.2 块3 3可靠通信网的建设3.3 可靠通信网的建设3 1连通度3.1 连通度B ⊆ E(G)为图G的k-边割

    论文研究-自组织网络分布式最小连通支配集创建算法.pdf

    针对无线自组织分组(Ad hoc)网络中最小连通支配集(MCDS)创建NP难问题,提出了...详细的仿真实验以及与其他创建最小连通支配集算法的比较表明,提出的DMCA算法在节点数量与节点传输范围变化时创建的最小连通集更小。

    无线传感器网络k点连通可靠性的研究

    给出了无线传感器网络k 点连通概率曲线和3 点连通的经验公式;分析了边界节点对网络连通度的影响。这些对无线传感器网络节点个数和节点通讯半径的选择、系统冗余设计等都具有重要的指导意义或参考价值。

    构建连通支配集CDS的matlab仿真程序

    构建连通支配集的matlab仿真程序。在matlab中可正常运行

    图论关于图的连通度

    图论关于图的连通度

    基于分享度的最小连通支配集求解算法 (2013年)

    以节点分享度作为选择分配点的优先级,提出一种最小连通支配集(CDS)求解算法。从根节点开始,将具有局部最大分享度的节点作为支配点,选择连接点与已确定的支配点连通,逐步构造网络的支配树,分析支配树的直径,...

    论文研究-基于连通度的分布式多维尺度分析节点定位技术 .pdf

    基于连通度的分布式多维尺度分析节点定位技术,张坤鹏,赵清华,研究了迭代优化方法在无线传感器网络节点定位中的应用,针对多维尺度分析定位技术和传统的梯度迭代优化方法,根据数值实验确定了

    论文研究-有向图连通支配集求解算法.pdf

    随后又设计了近似算法在规约后的有向图中求出一个较小的连通支配集;最后结合规约规则带来的一些良好特性设计了优化规则,通过优化变换的实施进一步缩减由近似算法求得的连通支配集。不同模型随机图上的模拟实验表明...

    无线传感器网络最小连通覆盖集问题求解算法

    当节点通信半径小于2 倍感知半径时,设计了一种基于最小生成树(minimum spanning tree,简称MST)的连通算法来计算确保CVT 算法构造的覆盖集连通所需的辅助节点..理论分析和实验数据表明,CVT(+MST)算法的性能在时间复杂...

    圆盘图中最小连通k-全控制集问题的算法

    圆盘图中最小连通k-全控制集问题的算法,李业芳,艾文宝,在本论文中,我们提出并研究双向圆盘图中的最小连通k全控制集问题,该问题在无线网络的虚拟骨干网的构造中有着很重要的意义。以�

    论文研究-2-连通2-支配集的集中式构造.pdf

    在无线传感器网络中,通常采用连通支配集来构成一个虚拟骨干网进行分层路由,对重要的目标或环境需要构造容错性高,可靠性好的虚拟骨干网。提出构造网络2-连通2-支配集的两种集中式算法,分别是先回路后支配和先支配...

    12. 并查集-如何快速判断节点连通性1

    但是实际上有着更高效的数据结构来判断节点间是否具有连通性,那就是并查集接口并查集这一数据结构由数组构建而成,使用数组下标来表示具体的节点,使用数组保存的值来表示

    论文研究-基于最小连通支配集的无线传感器网络容错研究.pdf

    无线传感器网络以往的研究中最小连通支配集主要是作为骨干网来使用,通过结合度来构建最小连通支配集,使得所构建的最小连通支配集不仅具备骨干网的功能,还具有容错的作用。提出了构建具有容错作用的基于度的最小...

Global site tag (gtag.js) - Google Analytics