求删除最少的点使得图不联通

将每一个点拆分为i,i',连接i,i'为1,若原图中存在g[u][v] = 1,连接u'到v,容量为INF,连接u,u'为1,连接v,v'为1

枚举源点和汇点,求出最小的最大流即为可以删除的最少点

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int INF=10000000;
const int N=100005;

struct Node
{
int v,cap,flow,next;
};

Node edges[N];
int n,m,s,t,head[N],e;
int num[N],h[N],curedge[N],pre[N];
int g[500][500];

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

void Add(int u,int v,int cap)
{
    add(u,v,cap);//正向边初始化为cap
    add(v,u,0);//反向边初始化为0
}

int Maxflow(int s,int t,int n)
{
int ans=0,i,k,x,d,u;

memset(num,0,sizeof(num));
memset(h,0,sizeof(h));
for(i=0;i<=n;i++) curedge[i]=head[i];
num[n]=n;u=s;
while(h[u]<n)//每一个节点到汇点的距离小于等于n-1
{
if(u==t)
{
d=INF+1;
//获得最短路径上的最小流和流出最小流的节点
for(i=s;i!=t;i=edges[curedge[i]].v) if(d>edges[curedge[i]].cap)
k=i,d=edges[curedge[i]].cap;
//更新图
for(i=s;i!=t;i=edges[curedge[i]].v)
{
x=curedge[i];
edges[x].cap-=d;
edges[x].flow+=d;
edges[x^1].cap+=d;
edges[x^1].flow-=d;
}
ans+=d;u=k;
}
//找到一条允许的边,即最短路径上的边,并将该节点的当前边记录下来。
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    //更新u节点到汇点的最短路
{
//某一种路径出现断流
if(--num[h[u]]==0) break;
//更新u节点的当前边和最短路
curedge[u]=head[u];
for(x=n,i=head[u];i!=-1;i=edges[i].next) if(edges[i].cap>0&&h[edges[i].v]<x)
x=h[edges[i].v];
h[u]=x+1;num[h[u]]++;
if(u!=s) u=pre[u];
}
}
return ans;
}

void makegraph()
{
    e = 0;
    memset(head,-1,sizeof(head));
    for(int i = 0;i<n;i++)
        for(int j = 0;j<n;j++)
        {
            if(g[i][j])
                Add(i+n,j,INF);
        }
    for(int i = 0;i<n;i++)
            Add(i,i+n,1);
}

int main()
{
    char ch[10];
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        int u,v;
        memset(head,-1,sizeof(head));
        memset(g,0,sizeof(g));
        e = 0;
        for(int i = 0;i<m;i++)
        {
            scanf("%s",ch);
            sscanf(ch,"(%d,%d)",&u,&v);
            g[u][v] = g[v][u] = 1;
        }

int ans = INF;
        if(n==1)
            {
                printf("1\n");
                continue;
            }
        if(m==0)
        {
            printf("0\n");
            continue;
        }
        s = 2*n;
        t = 2*n+1;
        for(int i = 0;i<n;i++)
            for(int j = 0;j<n;j++)
            {
                if(i==j||g[i][j])
                    continue;
                makegraph();
                Add(s,i+n,INF);
                Add(j,t,INF);
                int temp = Maxflow(s,t,t+1);
                if(temp<ans)
                    ans = temp;
                if(temp>=INF)
                    {
                        ans = n;
                        break;
                    }
            }
        if(ans>=INF)
            ans = n;
        printf("%d\n",ans);
    }
    return 0;
}

poj 1966 Cable TV Network相关推荐

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

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

  2. [POJ 1966] Cable TV Network

    [题目链接] http://poj.org/problem?id=1966 [算法] 拆点 + 最小割 [代码] #include <algorithm> #include <bit ...

  3. POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】

    题目描述: 给你一个无向图,问你最少删掉几个点,使这个图成不连通. 解题报告: 概念 (1)一个具有 N 个顶点的图,在去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通, ...

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

    题目链接:点击查看 题目大意:给定一张无向图,求最少去掉多少个点,可以使图不连通 题目分析:让图不连通,也就是让图分成两个部分,这样题目就转换成了最小割的问题了,不过最小割问题是要求最小割边,所以我们 ...

  5. poj 1966 Cable TV Network 顶点连通度

    题目链接 给一个图, n个点m条边, 求至少去掉多少个点可以使得图不再联通. 随便指定一个点为源点, 枚举其他点为汇点的情况, 跑网络流, 求其中最小的情况. 如果最后ans为inf, 说明是一个完全 ...

  6. Cable TV Network POJ - 1966 最大流最小割定理 点边转化

    最大流最小割定理 任何一个网络的最大流量等于最小割中边的容量之和 即最大流等于最小割 点边转化 节点可以拆为入点和出点 把点的属性添加到入点和出点之间的边上 图的边也可以分两截 在中间加一个节点 把边 ...

  7. POJ1966 Cable TV Network

    一.原题链接:http://poj.org/problem?id=1966 二.题目大意:给你一个很裸的网络,让你判断最少去掉多少个点能够使其不连通.注意是无向图. 三.思路:枚举每个源点和汇点,求每 ...

  8. UVA1660 电视网络 Cable TV Network(网络流,最小割)

    题目链接 题意翻译 电视电缆网络的继电器之间的连接是双向的.如果任意两个继电器之间都连通,那么这个网络就是连通的,否则不连通.特别地,一个空网络或只有一个继电器的网络是连通的. 定义一个有n个继电器的 ...

  9. POJ 1966 枚举 + Dinic

    题意 传送门 POJ 1966 Cable TV Network 题解 若无向图不连通,则图中至少存在两个点不连通,则可以枚举这两个点.若两个不同的点 s , t s,t s,t 因为删去某个点集而不 ...

最新文章

  1. 【Git入门之十二】DIY Git
  2. Qt 并行计算圆周率示例
  3. pd.get_dummies()
  4. 对话Justin Uberti:RTC的过去、现在和未来
  5. graph-easy 纯文本图绘制工具(表格或流程图)
  6. 《Java程序设计》学期总结
  7. Jquery和雅虎的YQL服务实现天气预报功能!
  8. python实现文字转语音的合成
  9. python 文字识别 之 pytesseract
  10. 【王道计组笔记】总线(2):性能指标分析
  11. Intellij IDEA 中的 Debug 控制台输出窗口消失
  12. html货币相关符号
  13. vs2010安装番茄插件
  14. 郝斌数据结构教学视频下载地址
  15. Java算法:经纬度转换 将百度转为高德经纬度
  16. Reactjs源码分析
  17. Unity-音频播放
  18. AutoCAD使用技巧集锦
  19. ORA-01653: 表 xxx 无法通过 (在表空间 xxx 中) 扩展
  20. 道路交通标志设计要素和基本原则

热门文章

  1. mysql 优化子查询_MySQL子查询的优化
  2. HTML根据当前时间显示问候语,用原生JS写根据时间显示问候语
  3. ecshop 二次开发基本思想 授之以鱼,不如授人以渔
  4. cookie与登录注册
  5. 绕过kernel32自己实现WriteProcessMemory
  6. MFC SetWindowPos与MoveWindow的用法
  7. latex实现双击PDF跳转到相应源处
  8. javascripts再进
  9. 逃离塔科夫最新无挂服务器,逃离塔科夫离线版服务端
  10. JAXB学习笔记(一)