题目链接: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. Cable TV Network 顶点连通度 (最大流算法)

    Cable TV Network 题目抽象:给出含有n个点顶点的无向图,给出m条边.求定点联通度   K 算法:将每个顶点v拆成 v'   v''  ,v'-->v''的容量为1.       ...

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

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

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

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

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

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

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

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

  8. UVA1660 电视网络 Cable TV Network

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

  9. POJ 1966 Cable TV Network

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

随机推荐

  1. clock gating and PLL

    一个gating的clock是指:clock network除了包含inverter和buffer外,还有其他logic. PrimeTime会自动的对gating input进行setup和hold ...

  2. PHP生成二维码【谷歌API+qrcode+圆角Logo】

    方法一:谷歌二维码API 接口地址:https://chart.googleapis.com/chart 官方文档:https://developers.google.com/chart/infogr ...

  3. [置顶] lua 进阶3--lua文件中调用C++函数

    前面讲了一下,C++读取lua文件中的变量,包括一维表.二维表这些,这节讲一下如何在lua文件中去调用C++函数 C++代码如下 #include <stdio.h> extern &qu ...

  4. 【python cookbook】【数据结构与算法】11.对切片命名

    问题:如何清理掉到处都是硬编码的切片索引 解决方案:对切片命名 假设有一些代码用来从字符串的固定位置中取出具体的数据(比如从一个平面文件或类似的格式:平面文件flat file是一种包含没有相对关系结 ...

  5. CC2541的任务与事件,以及红外捕捉.

    因为红外遥控要占用的系统中断时间可能超过了80ms, 极有可能导致蓝牙断线, 特别是连续两次按键, 100%断线. 后来根据蓝牙技术群里的哥们提示, 觉得不能在一个中断中delay得太久, 只能用任务 ...

  6. linux string 操作

    http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html 字符替换 sed -i 's/3306/3308/g' my.cnf my ...

  7. DBLINK的session无法关闭,报异常!

    ------解决方法-------------------------------------------------------- --ALTER SESSION alter session clo ...

  8. Linux下资源利用率监测利器—nmon使用

    最近接了一个任务,就是测试公司服务器的资源利用率,这样对每种业务平时所占资源有了大体的了解,进而为下一步的虚拟化做准备.找了很多开源的工具,但都不理想,有的安装很复杂,需要联网(而我们的服务器很多都不 ...

  9. MySQL对于数据库应该如何如何配置安全问题了

    mysql 是完全网络化的跨平台关系型数据库系统,同时是具有客户机/服务器体系结构的分布式数据库管理系统.它具有功能强.使用简便.管理方便.运行速度快.安全可靠性强等优点,用户可利用许多语言编写访问m ...

  10. 快速稳定的维护PHP

    Just to recap, previously we'd have this sort of thing: namespace me\adamcameron\testApp; use Guzzle ...