题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2182

题意:给出一个无向图,问最少删掉多少个顶点之后图变得不连通?

思路:将原图每个点拆点(i,i+n),连边<i,i+n,1>,对原图的边(u,v),连边<u+n,v,INF>,<v+n,u,INF>。然后对于每对顶点(i,j)跑最大流(i+n,j)。所有最大流的最小值即为答案。

struct node
{
    int v,cap,next;
};

node edges[N*10];
int head[N],e;
int curedge[N],h[N],num[N],pre[N];
int s,t;

void add(int u,int v,int cap)
{
    edges[e].v=v;
    edges[e].cap=cap;
    edges[e].next=head[u];
    head[u]=e++;
}

void Add(int u,int v,int cap)
{
    add(u,v,cap);
    add(v,u,0);
}

int Maxflow(int s,int t,int n)
{
    clr(h,0); clr(num,0);
    int i;
    FOR0(i,n+1) curedge[i]=head[i];
    int u=s,Min,k,x,ans=0;
    while(h[u]<n)
    {
        if(u==t)
        {
            Min=INF*100;
            for(i=s;i!=t;i=edges[curedge[i]].v)
            {
                x=curedge[i];
                if(edges[x].cap<Min)
                {
                    Min=edges[x].cap;
                    k=i;
                }
            }
            ans+=Min; u=k;
            for(i=s;i!=t;i=edges[curedge[i]].v)
            {
                x=curedge[i];
                edges[x].cap-=Min;
                edges[x^1].cap+=Min;
            }
        }
        for(i=curedge[u];i!=-1;i=edges[i].next)
        {
            if(edges[i].cap>0&&h[u]==h[edges[i].v]+1)
            {
                break;
            }
        }
        if(i!=-1)
        {
            curedge[u]=i;
            pre[edges[i].v]=u;
            u=edges[i].v;
        }
        else
        {
            if(--num[h[u]]==0) break;
            curedge[u]=head[u];
            x=n;
            for(i=head[u];i!=-1;i=edges[i].next)
            {
                k=edges[i].v;
                if(edges[i].cap>0&&h[k]<x) x=h[k];
            }
            h[u]=x+1; num[x+1]++;
            if(u!=s) u=pre[u];
        }
    }
    return ans;
}

int n,m;
int a[55][55];

int visit[55];

void DFS(int u)
{
    visit[u]=1;
    int i,v;
    FOR1(i,n) if(a[u][i]&&!visit[i])
    {
        DFS(i);
    }
}

int ok()
{
    clr(visit,0);
    DFS(1);
    int i;
    FOR1(i,n) if(!visit[i]) return 0;
    return 1;
}

int cal(int s,int t)
{
    clr(head,-1); e=0;
    int i,j;
    FOR1(i,n) Add(i,i+n,1);
    FOR1(i,n) for(j=1;j<=n;j++) if(a[i][j])
    {
        Add(i+n,j,INF);
    }

    return Maxflow(s+n,t,n+n+2);
}

int get()
{
    int x=0;
    char c=getchar();
    while(!isdigit(c))c=getchar();
    while(isdigit(c))
    {
        x=x*10+c-'0';
        c=getchar();
    }
    return x;
}

int main()
{
    while(scanf("%d%d",&n,&m)!=-1)
    {
        if(m==0)
        {
            if(n==0) puts("0");
            else if(n==1) puts("1");
            else puts("0");
            continue;
        }
        clr(a,0);
        int u,v,i;
        FOR0(i,m)
        {
            u=get(); v=get();

            a[u+1][v+1]=a[v+1][u+1]=1;
        }

        if(!ok())
        {
            puts("0");
            continue;
        }
        int j;
        int ans=INF;
        FOR1(i,n) for(j=1;j<=n;j++) if(i!=j)
        {
            int x=cal(i,j);
            ans=min(ans,x);
        }
        if(ans==INF||ans==n-1) ans=n;
        PR(ans);
    }
}

ZOJ 2182 Cable TV Network(无向图点割-最大流)的更多相关文章

  1. POJ 1966 ZOJ 2182 Cable TV Network

    无向图顶点连通度的求解,即最少删除多少个点使无向图不连通. 我校“荣誉”出品的<图论算法理论.实现及其应用>这本书上写的有错误,请不要看了,正确的是这样的: 对于每个顶点,分成两个点,v和 ...

  2. poj1966Cable TV Network——无向图最小割(最大流)

    题目:http://poj.org/problem?id=1966 把一个点拆成入点和出点,之间连一条边权为1的边,跑最大流即最小割: 原始的边权赋成inf防割: 枚举源点和汇点,直接相邻的两个点不必 ...

  3. POJ 1966 Cable TV Network (无向图点连通度)

    [题意]给出一个由n个点,m条边组成的无向图.求最少去掉多少点才能使得图中存在两点,它们之间不连通. [思路]回想一下s->t的最小点割,就是去掉多少个点能使得s.t不连通.那么求点连通度就枚举 ...

  4. UVA-1660 Cable TV Network (最小割)

    题目大意:给一张n个点.m条边的无向图,求最小点割集的基数. 题目分析:求无向图最小点割集的基数可以变成求最小割.考虑单源s单汇t的无向图,如果要求一个最小点集,使得去掉这个点集后图不再连通(连通分量 ...

  5. POJ 1966 Cable TV Network (最大流最小割)

    $ POJ~1966~Cable~TV~Network $ $ solution: $ 第一眼可能让人很难下手,但本就是冲着网络流来的,所以我们直接一点.这道题我们要让这个联通图断开,那么势必会有两个 ...

  6. POJ 1966 Cable TV Network(顶点连通度的求解)

                               Cable TV Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissi ...

  7. UVA1660 电视网络 Cable TV Network

    题目地址:UVA1660 电视网络 Cable TV Network 枚举两个不直接连通的点 \(S\) 和 \(T\) ,求在剩余的 \(n-2\) 个节点中最少去掉多少个可以使 \(S\) 和 \ ...

  8. POJ 1966 Cable TV Network

    Cable TV Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4702   Accepted: 2173 ...

  9. POJ 1966 Cable TV NETWORK(网络流-最小点割集)

                                    Cable TV NETWORK The interconnection of the relays in a cable TV net ...

随机推荐

  1. Servlet/JSP-03 HttpServlet

    一. GenericServlet GenericServlet本身是一个抽象类,并且实现了Servlet和ServletConfig接口 其在内部定义了一个私有的ServletConfig类型的变量 ...

  2. 树莓派配置AP模式

    所需硬件:树莓派.无线网卡 1.查看无线网卡是否被识别 pi@raspberrypi ~ $ sudo lsusb Bus Device : ID : Standard Microsystems Co ...

  3. 240多个jQuery插件

    概述 jQuery 是继 prototype 之后又一个优秀的 Javascript 框架.其宗旨是—写更少的代码,做更多的事情.它是轻量级的 js 库(压缩后只有21k) ,这是其它的 js 库所不 ...

  4. JavaScript 客户端JavaScript之样式表操作(DOM API 提供模块之一)

    层叠样式 表和动态HTML   层叠样式表(CSS)是指定HTML文档或XML文档的表现的标准.     使用CSS和Javascript,可以创建出各种视觉效果,这些效果可以统称为动态HTML(DH ...

  5. Zookeeper介绍

    Zookeeper是一个分布式的开源系统,目的是为分布式应用提供协调一致性服务. 分布式应用可以在Zookeeper提供的简单原语集之上构造更高层次的服务.比如统一命名服务.状态同步服务.集群管理.分 ...

  6. Blend4精选案例图解教程(五):可视数据管理

    原文:Blend4精选案例图解教程(五):可视数据管理 应用程序中我们会经常需要操作数据,在程序设计之初示例数据一般都是手工添加,Blend4提供了非常方便的数据管理能力,包括丰富的数据类型和内置示例 ...

  7. python监控微信报警

    微信接口调用代码: #coding=utf8 import itchat from flask import Flask, request itchat.auto_login(enableCmdQR= ...

  8. Node.js 常用工具util

    util 是一个Node.js 核心模块,提供常用函数的集合,用于弥补核心JavaScript 的功能 过于精简的不足. util.inherits util.inherits(constructor ...

  9. 从锅炉工到AI专家(9)

    无监督学习 前面已经说过了无监督学习的概念.无监督学习在实际的工作中应用还是比较多见的. 从典型的应用上说,监督学习比较多用在"分类"上,利用给定的数据,做出一个决策,这个决策在有 ...

  10. 安装 jenkins

    1. 将jenkins.war包放在 tomcat  的 webapps 目录下即可 2 重启 tomcat 3. 通过浏览器访问 IP:8080/jenkins