UVa1660 Cable TV Network (无向图,点连通度,最大流)

链接:http://bak3.vjudge.net/problem/UVA-1660

分析:这篇博客讲的很详细。http://www.cnblogs.com/xcw0754/p/4662429.html

 1 #include <cstdio>
 2 #include <queue>
 3 #include <cstring>
 4 #include <vector>
 5 using namespace std;
 6
 7 const int maxn = 100 + 5;
 8 const int INF = 0x3f3f3f3f;
 9
10 struct Edge {
11     int from, to, cap, flow;
12     Edge(int u, int v, int c, int f):from(u), to(v), cap(c), flow(f) {}
13 };
14
15 struct EdmondsKarp {
16     int n, m;
17     vector<Edge> edges;
18     vector<int> G[maxn];
19     int a[maxn];
20     int p[maxn];
21
22     void init(int n) {
23         for (int i = 0; i < n; i++) G[i].clear();
24         edges.clear();
25     }
26
27     void AddEdge(int from, int to, int cap) {
28         edges.push_back(Edge(from, to, cap, 0));
29         edges.push_back(Edge(to, from, 0, 0));
30         m = edges.size();
31         G[from].push_back(m - 2);
32         G[to].push_back(m - 1);
33     }
34
35     int Maxflow(int s, int t) {
36         int flow = 0;
37         for (;;) {
38             memset(a, 0, sizeof(a));
39             queue<int> Q;
40             Q.push(s);
41             a[s] = INF;
42             while (!Q.empty()) {
43                 int x = Q.front(); Q.pop();
44                 for (int i = 0; i < G[x].size(); i++) {
45                     Edge& e = edges[G[x][i]];
46                     if (!a[e.to] && e.cap > e.flow) {
47                         p[e.to] = G[x][i];
48                         a[e.to] = min(a[x], e.cap - e.flow);
49                         Q.push(e.to);
50                     }
51                 }
52                 if (a[t]) break;
53             }
54             if (!a[t]) break;
55             for (int u = t; u != s; u = edges[p[u]].from) {
56                 edges[p[u]].flow += a[t];
57                 edges[p[u] ^ 1].flow -= a[t];
58             }
59             flow += a[t];
60         }
61         return flow;
62     }
63 };
64
65 EdmondsKarp g;
66 vector<Edge> bak;
67
68 int main() {
69     int n, m;
70     while (scanf("%d%d", &n, &m) == 2) {
71         g.init(n * 2);
72         for (int i = 0; i < n; i++) g.AddEdge(i, i + n, 1);
73         for (int i = 0, u, v; i < m; i++) {
74             scanf(" (%d,%d)", &u, &v);
75             g.AddEdge(u + n, v, INF);
76             g.AddEdge(v + n, u, INF);
77         }
78         int s = n, flow = n; bak = g.edges;
79         for (int i = 1; i < n; i++) {
80                 g.edges = bak;
81                 flow = min(flow, g.Maxflow(s, i));
82         }
83         printf("%d\n", flow);
84     }
85     return 0;
86 }
时间: 2024-08-03 15:09:46

UVa1660 Cable TV Network (无向图,点连通度,最大流)的相关文章

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

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

UVA1660 Cable TV Network

求无向图的点连通分量,把一个点拆成一个入点和一个出点,之间连一条容量为1的有向边,表示能被用一次.最大流求最小割即可. 一些细节的东西:1.源点固定,汇点要枚举一遍,因为最小割割断以后会形成连通分量,在源点的那个连通分量里的割会更大. 2.每次枚举重建一下图.3.从入点进出点出就被认为是经过了一个原来的点,那么源点和汇点是不必经过的,所以一个在出点,另外一个枚举入点. #include<bits/stdc++.h> using namespace std; const int maxn = 1

UVA-1660 Cable TV Network (最小割)

题目大意:给一张n个点.m条边的无向图,求最小点割集的基数. 题目分析:求无向图最小点割集的基数可以变成求最小割.考虑单源s单汇t的无向图,如果要求一个最小点集,使得去掉这个点集后图不再连通(连通分量数目增多),只需将每个点拆成两个(入点和出点),并且之间连一条容量为1的弧,其他弧不变,在新网络上求最小割便得到这个最小点集的基数.但是本题无源无汇,可以指定一个点作为源点,枚举其它的点作为汇点,求得n-1个点集基数,取最小的便是答案.要注意每次枚举都要重新建图. 代码如下: # include<i

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 Cable TV Network(无向图的顶点连通度)

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

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: 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

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

UVA 1660 Cable TV Network 电视网络(无向图,点连通度,最大流)

题意:给一个无向图,求其点连通度?(注意输入问题) 思路: 如果只有1个点,那么输出“1”: 如果有0条边,那么输出“0”: 其他情况:用最大流解决.下面讲如何建图: 图的连通度问题是指:在图中删去部分元素(点或边),使得图中指定的两个点s和t不连通(即不存在从s到t的路径),求至少要删去几个元素. 图的连通度分为点连通度和边连通度: (1)点连通度:只许删点,求至少要删掉几个点(当然,s和t不能删去,这里保证原图中至少有三个点): (2)边连通度:只许删边,求至少要删掉几条边. 并且,有向图和