poj 1966 Cable TV Network 顶点连通度

题目链接

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

  1 #include <iostream>
  2 #include <vector>
  3 #include <cstdio>
  4 #include <cstring>
  5 #include <algorithm>
  6 #include <cmath>
  7 #include <map>
  8 #include <set>
  9 #include <string>
 10 #include <queue>
 11 using namespace std;
 12 #define pb(x) push_back(x)
 13 #define ll long long
 14 #define mk(x, y) make_pair(x, y)
 15 #define lson l, m, rt<<1
 16 #define mem(a) memset(a, 0, sizeof(a))
 17 #define rson m+1, r, rt<<1|1
 18 #define mem1(a) memset(a, -1, sizeof(a))
 19 #define mem2(a) memset(a, 0x3f, sizeof(a))
 20 #define rep(i, a, n) for(int i = a; i<n; i++)
 21 #define ull unsigned long long
 22 typedef pair<int, int> pll;
 23 const double PI = acos(-1.0);
 24 const double eps = 1e-8;
 25 const int mod = 1e9+7;
 26 const int inf = 1061109567;
 27 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
 28 const int maxn = 4e4+5;
 29 int q[maxn*2], head[maxn*2], dis[maxn/10], s, t, num, edge[2500][2];
 30 struct node
 31 {
 32     int to, nextt, c;
 33     node(){}
 34     node(int to, int nextt, int c):to(to), nextt(nextt), c(c){}
 35 }e[maxn*2];
 36 void init() {
 37     num = 0;
 38     mem1(head);
 39 }
 40 void add(int u, int v, int c) {
 41     e[num] = node(v, head[u], c); head[u] = num++;
 42     e[num] = node(u, head[v], 0); head[v] = num++;
 43 }
 44 int bfs() {
 45     mem(dis);
 46     dis[s] = 1;
 47     int st = 0, ed = 0;
 48     q[ed++] = s;
 49     while(st<ed) {
 50         int u = q[st++];
 51         for(int i = head[u]; ~i; i = e[i].nextt) {
 52             int v = e[i].to;
 53             if(!dis[v]&&e[i].c) {
 54                 dis[v] = dis[u]+1;
 55                 if(v == t)
 56                     return 1;
 57                 q[ed++] = v;
 58             }
 59         }
 60     }
 61     return 0;
 62 }
 63 int dfs(int u, int limit) {
 64     if(u == t) {
 65         return limit;
 66     }
 67     int cost = 0;
 68     for(int i = head[u]; ~i; i = e[i].nextt) {
 69         int v = e[i].to;
 70         if(e[i].c&&dis[v] == dis[u]+1) {
 71             int tmp = dfs(v, min(limit-cost, e[i].c));
 72             if(tmp>0) {
 73                 e[i].c -= tmp;
 74                 e[i^1].c += tmp;
 75                 cost += tmp;
 76                 if(cost == limit)
 77                     break;
 78             } else {
 79                 dis[v] = -1;
 80             }
 81         }
 82     }
 83     return cost;
 84 }
 85 int dinic() {
 86     int ans = 0;
 87     while(bfs()) {
 88         ans += dfs(s, inf);
 89     }
 90     return ans;
 91 }
 92 int main()
 93 {
 94     int n, m, x, y;
 95     while(~scanf("%d%d", &n, &m)) {
 96         for(int i = 0; i<m; i++) {
 97             scanf(" (%d,%d)", &edge[i][0], &edge[i][1]);
 98         }
 99         s = n;
100         int ans = inf;
101         for(int i = 1; i<n; i++) {
102             t = i;
103             init();
104             for(int j = 0; j<m; j++) {
105                 int x = edge[j][0];
106                 int y = edge[j][1];
107                 add(x+n, y, inf);
108                 add(y+n, x, inf);
109             }
110             for(int j = 0; j<n; j++)
111                 add(j, j+n, 1);
112             ans = min(ans, dinic());
113         }
114         if(ans == inf)
115             ans = n;
116         cout<<ans<<endl;
117     }
118     return 0;
119 }
时间: 2024-10-22 16:04:15

poj 1966 Cable TV Network 顶点连通度的相关文章

POJ 1966 Cable TV Network(无向图的顶点连通度)

POJ 1966 Cable TV Network 链接:http://poj.org/problem?id=1966 题意:有线电视网络中,中继器的连接是双向的.如果网络中任何两个中继器之间至少有一条路,则中继器网络称为是连通的,否则中继器网络是不连通的.一个空的网络.以及只有一个中继器的网络被认为是连通的.具有n 个中继器的网络的安全系数f 被定义成: (1) f 为n,如果不管删除多少个中继器,剩下的网络仍然是连通的: (2) f 为删除最少的顶点数,使得剩下的网络不连通. 现在给定一个有

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

Cable TV Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4678   Accepted: 2163 Description The interconnection of the relays in a cable TV network is bi-directional. The network is connected if there is at least one interconnecti

Cable TV Network 顶点连通度 (最大流算法)

Cable TV Network 题目抽象:给出含有n个点顶点的无向图,给出m条边.求定点联通度   K 算法:将每个顶点v拆成 v'   v''  ,v'-->v''的容量为1.           对于原图中的边(u,v)   连边   u''--->v'    v''-->u'.    求每对定点的P(u,v);以u为源点,v为汇点. 我们只需固定一个顶点,枚举其它汇点. 1 #include <iostream> 2 #include <cstdio> 3

POJ 1966 Cable TV Network

Cable TV Network Time Limit: 1000ms Memory Limit: 30000KB This problem will be judged on PKU. Original ID: 196664-bit integer IO format: %lld      Java class name: Main The interconnection of the relays in a cable TV network is bi-directional. The ne

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

Description n个点的无向图,问最少删掉几个点,使得图不连通 n<=50 m也许可以到完全图? Solution 最少,割点,不连通,可以想到最小割. 发现,图不连通,必然存在两个点不连通. 枚举源点汇点,要让源点汇点不连通.源点汇点不能割掉 网络建图: 为了割的是边,所以要点转化成边. 对于每个x,建立x'=x+n,对于不是S.T的点(因为S.T不能割掉),x向x'连一条边权为1的边 对于原图的边e(x,y) x'->y 连接inf的边,y'->x连接inf的边. 边权保证割

ZOJ 2182 Cable TV Network(无向图点割-最大流)

题目链接: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,nex

POJ 1966 ZOJ 2182 Cable TV Network

无向图顶点连通度的求解,即最少删除多少个点使无向图不连通. 我校“荣誉”出品的<图论算法理论.实现及其应用>这本书上写的有错误,请不要看了,正确的是这样的: 对于每个顶点,分成两个点,v和v’: 对于每个顶点,v到v’建边,容量为1: 对于无向边(u,v),建边<u’,v>和<v’,u>容量为+∞: 然后枚举每一对没有边直接相连的点对(x,y),x’为源点,y为汇点,跑最大流.最大流的最小值即为答案. #include<cstdio> #include<

POJ1966.Cable TV Network——无向图的点连通度

http://poj.org/problem?id=1966 题目描述: 有线电视网络中,中继器的连接是双向的.如果网络中任何两个中继器之间至少有一条路,则中继器网络称为是连通的,否则中继器网络是不连通的.一个空的网络.以及只有一个中继器的网络被认为是连通的.具有n 个中继器的网络的安全系数f 被定义成: (1) f 为n,如果不管删除多少个中继器,剩下的网络仍然是连通的: (2) f 为删除最少的顶点数,使得剩下的网络不连通. 分析: 本题中的安全系数f 实际上就是无向图的顶点连通度κ(G).

POJ1966(Cable TV Network)

题目链接:传送门 题目大意:给你一副无向图,求解图的顶点连通度 题目思路:模板(图论算法理论,实现及应用 P396) Menger定理:无向图G的顶点连通度k(G)和顶点间最大独立轨数目之间存在如下关系: 1.若G是完全图,k(G)=|V(G)|-1 2.若G不是完全图,k(G)=min{P(A,B)}  其中A,B不直接相连 #include <iostream> #include <cstdio> #include <cstdlib> #include <cm