http://poj.org/problem?id=1966

题意:给出一个由n个点,m条边组成的无向图。求最少去掉多少点才能使得图中存在两点,它们之间不连通。

思路:将点i拆成a和b,连一条a->b的容量为1的边,代表这个点只能走一次,然后如果点i和点j有边相连,那么将bi和aj相连,bj和ai相连,容量为INF,代表这条边可以走INF次。

然后O(n^2)枚举源点和汇点跑最大流,算的最小的最大流就是答案。(这个时候的最大流代表的是S跑到T需要经过多少路径(最小割),如果得到的最大流是INF,那么代表图完全连通,因此还要和n取一个较小值)。

有一个以前模板的点要完善:初始化 index = S;

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. using namespace std;
  5. #define N 210
  6. #define INF 0x3f3f3f3f
  7. struct Edge {
  8. int v, nxt, cap, init;
  9. Edge () {}
  10. Edge (int v, int nxt, int cap, int init) : v(v), nxt(nxt), cap(cap), init(init) {}
  11. } edge[N*N];
  12. int head[N], tot, dis[N], cur[N], pre[N], gap[N], n, m;
  13.  
  14. void Add(int u, int v, int cap) {
  15. edge[tot] = Edge(v, head[u], cap, cap); head[u] = tot++;
  16. edge[tot] = Edge(u, head[v], , ); head[v] = tot++;
  17. }
  18.  
  19. int BFS(int S, int T) {
  20. queue<int> que; que.push(T);
  21. memset(dis, INF, sizeof(dis));
  22. memset(gap, , sizeof(gap));
  23. gap[]++; dis[T] = ;
  24. while(!que.empty()) {
  25. int u = que.front(); que.pop();
  26. for(int i = head[u]; ~i; i = edge[i].nxt) {
  27. int v = edge[i].v;
  28. if(dis[v] == INF) {
  29. dis[v] = dis[u] + ;
  30. gap[dis[v]]++;
  31. que.push(v);
  32. }
  33. }
  34. }
  35. }
  36.  
  37. int ISAP(int S, int T, int n) {
  38. BFS(S, T);
  39. memcpy(cur, head, sizeof(cur));
  40. int u = pre[S] = S, i, index, flow, ans = ;
  41. while(dis[S] < n) {
  42. if(u == T) {
  43. flow = INF, index = S; // index = S !!!
  44. for(i = S; i != T; i = edge[cur[i]].v)
  45. if(flow > edge[cur[i]].cap) flow = edge[cur[i]].cap, index = i;
  46. for(i = S; i != T; i = edge[cur[i]].v)
  47. edge[cur[i]].cap -= flow, edge[cur[i]^].cap += flow;
  48. ans += flow, u = index;
  49. }
  50. for(i = cur[u]; ~i; i = edge[i].nxt)
  51. if(edge[i].cap > && dis[edge[i].v] == dis[u] - ) break;
  52. if(~i) {
  53. pre[edge[i].v] = u; cur[u] = i; u = edge[i].v;
  54. } else {
  55. if(--gap[dis[u]] == ) break;
  56. int md = n;
  57. for(i = head[u]; ~i; i = edge[i].nxt)
  58. if(md > dis[edge[i].v] && edge[i].cap > ) md = dis[edge[i].v], cur[u] = i;
  59. gap[dis[u] = md + ]++;
  60. u = pre[u];
  61. }
  62. }
  63. return ans;
  64. }
  65.  
  66. int main() {
  67. while(~scanf("%d%d", &n, &m)) {
  68. memset(head, -, sizeof(head)); tot = ;
  69. for(int i = ; i <= n; i++) Add(i, i + n, );
  70. for(int i = ; i <= m; i++) {
  71. int u, v; scanf(" (%d, %d)", &u, &v);
  72. u++, v++;
  73. Add(u + n, v, INF); Add(v + n, u, INF);
  74. }
  75. int ans = INF;
  76. for(int i = ; i < n; i++) {
  77. for(int j = i + ; j <= n; j++) {
  78. for(int k = ; k < tot; k++) edge[k].cap = edge[k].init;
  79. int now = ISAP(i + n, j, * n);
  80. if(now < ans) ans = now;
  81. }
  82. }
  83. if(ans > n) ans = n;
  84. printf("%d\n", ans);
  85. }
  86. return ;
  87. }

POJ 1966:Cable TV Network(最小点割集)***的更多相关文章

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

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

  2. POJ 1966 Cable TV Network

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

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

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

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

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

  5. POJ 1966 Cable TV Network (点连通度)【最小割】

    <题目链接> 题目大意: 给定一个无向图,求点连通度,即最少去掉多少个点使得图不连通. 解题分析: 解决点连通度和边连通度的一类方法总结见   >>> 本题是求点连通度, ...

  6. POJ 1966 Cable TV Network 【经典最小割问题】

    Description n个点的无向图,问最少删掉几个点,使得图不连通 n<=50 m也许可以到完全图? Solution 最少,割点,不连通,可以想到最小割. 发现,图不连通,必然存在两个点不 ...

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

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

  8. POJ - 1966 Cable TV Network (最大流求点连通度)

    题意:求一个无向图的点连通度.点联通度是指,一张图最少删掉几个点使该图不连通:若本身是非连通图,则点连通度为0. 分析:无向图的点连通度可以转化为最大流解决.方法是:1.任意选择一个点作为源点:2.枚 ...

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

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

  10. POJ 1966 Cable TV Network (算竞进阶习题)

    拆点+网络流 拆点建图应该是很常见的套路了..一张无向图不联通,那么肯定有两个点不联通,但是我们不知道这两个点是什么. 所以我们枚举所有点,并把每个点拆成入点和出点,每次把枚举的两个点的入点作为s和t ...

随机推荐

  1. XF 通过判断平台加载不同的图片

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. 【Git】生成Patch和使用Patch

    1.生成Patch(俗称快照) 先来看看repo manifest 的用法 <1>cd /工作目录/项目目录/.repo/manifests <2>repo manifest ...

  3. PHPEXCEL 不能输出中文内容,只显示空白

    以他带的示例文件为例 01simple-download-xls.php // Add some data $objPHPExcel->setActiveSheetIndex(0)        ...

  4. vs2010 编译release没问题debug编译不通过

    ------ 已启动全部重新生成: 项目: VM661JTcpDLL, 配置: Debug Win32 ------生成启动时间为 2018-12-29 14:07:20.项目文件包含 ToolsVe ...

  5. c#利用IronPython调用python的过程种种问题

    c#利用IronPython调用python的过程种种问题 小菜鸟一枚,最新学习了Python,感觉语言各种简短,各种第三方类库爽歪歪,毕竟之前是从c#转来的,看到Python的request类各种爽 ...

  6. ORACLE 11.2.0.4 Single To Single Data Guard 安装 physical standby

    [root@ORACLE ~]# su - oracle [oracle@ORACLE ~]$ sqlplus / as sysdba . 查看主库归档模式: SQL> select log_m ...

  7. QT5.6,5.7,5.8的新特征以及展望(Qt5.7首次正式支持Qt3D,以前都是预览版)

    https://wiki.qt.io/New_Features_in_Qt_5.6 (跨平台High-DPI,改进WebEngine到45,支持WIN 10,Canvas3D,3D) https:// ...

  8. qtchooser - a wrapper used to select between Qt development binary(2种方法)

    ---------------------------------------------------------------------------------------------------- ...

  9. CSocket实现端口扫描

    界面如下: 主要代码如下: //对于每一个线程,传过去的参数 typedef struct ThreadParamStruct { CString strIP; //要扫描的IP地址 UINT uPo ...

  10. linux dll hell--链接库real name, soname, link name

    DLL hell 是指 Windows 系统上动态库的新版本覆盖旧版本,且新版本不能兼容旧版本的问题. 例如:装新软件,但原有的软件运行不起来了.   Linux 系统下也同样面临着和 Windows ...