UVa 1660 电视网络(点连通度+最小割最大流+Dinic)

https://vjudge.net/problem/UVA-1660

题意:
给出一个无向图,求出点连通度。即最少删除多少个点,使得图不连通。

思路:

如果求线连通度的话,直接求个最大流就可以了。但这题我们删除的是点,用拆点法来使点具有流量的性质,把每个点都拆分为两个点,容量为1,表示可以使用一次。然后,题目中给出的连通的点之间的容量设为INF,因为我们不是要删除这两点之间的线。

最后,我们固定一个源点,枚举汇点,找到最小的删除数。

  1 #include<iostream>
  2 #include<algorithm>
  3 #include<cstring>
  4 #include<string>
  5 #include<vector>
  6 #include<queue>
  7 using namespace std;
  8
  9 const int maxn = 105;
 10 const int INF = 0x3f3f3f3f;
 11
 12 struct Edge
 13 {
 14     int from,to, cap, flow;
 15     Edge(int u, int v, int c, int f) :from(u), to(v), cap(c), flow(f){}
 16 };
 17
 18 int n, m,t;
 19 vector<Edge> edges;
 20 vector<Edge> edge;
 21 vector<int> G[maxn];
 22 int vis[maxn];
 23 int d[maxn];   //从起点到i的距离
 24 int cur[maxn]; //当前弧下标
 25 int flow;
 26
 27 void init()
 28 {
 29     for (int i = 0; i < maxn; i++)
 30         G[i].clear();
 31     edges.clear();
 32 }
 33
 34 void AddEdge(int from, int to, int cap)
 35 {
 36     edges.push_back(Edge(from, to, cap, 0));
 37     edges.push_back(Edge(to, from, 0, 0));
 38     int m = edges.size();
 39     G[from].push_back(m - 2);
 40     G[to].push_back(m - 1);
 41 }
 42
 43
 44 int BFS(int s,int t)
 45 {
 46     memset(vis, 0, sizeof(vis));
 47     memset(d, 0, sizeof(d));
 48     queue<int> Q;
 49     Q.push(s);
 50     d[s] = 0;
 51     vis[s] = 1;
 52     while (!Q.empty())
 53     {
 54         int x = Q.front();
 55         Q.pop();
 56         for (int i = 0; i < G[x].size(); i++)
 57         {
 58             Edge& e = edges[G[x][i]];
 59             if (!vis[e.to] && e.cap>e.flow)
 60             {
 61                 vis[e.to] = 1;
 62                 d[e.to] = d[x] + 1;
 63                 Q.push(e.to);
 64             }
 65         }
 66     }
 67     return vis[t];
 68 }
 69
 70 int DFS(int x,int t,int a)
 71 {
 72     if (x == t || a == 0)  return a;
 73     int flow = 0, f;
 74     for (int& i = cur[x]; i < G[x].size(); i++)
 75     {
 76         Edge& e = edges[G[x][i]];
 77         if (d[x] + 1 == d[e.to] && (f = DFS(e.to,t ,min(a,e.cap - e.flow)))>0)
 78         {
 79             e.flow += f;
 80             edges[G[x][i] ^ 1].flow -= f;
 81             flow += f;
 82             a -= f;
 83             if (a == 0)  break;
 84         }
 85     }
 86     return flow;
 87 }
 88
 89 void Maxflow(int s,int t)
 90 {
 91     flow = 0;
 92     while (BFS(s,t))
 93     {
 94         memset(cur, 0, sizeof(cur));
 95         flow += DFS(s, t,INF);
 96     }
 97 }
 98
 99 int main()
100 {
101     //freopen("D:\\txt.txt", "r", stdin);
102     int x,y;
103     while (~scanf("%d%d",&n,&m))
104     {
105         init();
106         for (int i = 1; i < n; i++)
107             AddEdge(i, i + n, 1);
108         for (int i = 0; i < m; i++)
109         {
110             scanf(" (%d,%d)", &x, &y);
111             AddEdge(x + n, y, INF);
112             AddEdge(y + n, x, INF);
113         }
114         edge = edges;
115         flow = 0;
116         int ans = n;
117         for (int i = 1; i < n; i++)
118         {
119             edges = edge;     //这个不能忘
120             Maxflow(n, i);    //0为源点,因为前面都加了n,所以这里0也要加上n
121             ans = min(ans, flow);
122         }
123         printf("%d\n",ans);
124     }
125 }
时间: 2024-10-29 00:24:14

UVa 1660 电视网络(点连通度+最小割最大流+Dinic)的相关文章

uva 1212 Duopoly (最小割最大流)

uva 1212 Duopoly Description The mobile network market in country XYZ used to be dominated by two large corporations, XYZ Telecom and XYZ Mobile. The central government recently has realized that radio frequency spectrum is a scarce resource and want

【BZOJ-1797】Mincut 最小割 最大流 + Tarjan + 缩点

1797: [Ahoi2009]Mincut 最小割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1685  Solved: 724[Submit][Status][Discuss] Description A,B两个国家正在交战,其中A国的物资运输网中有N个中转站,M条单向道路.设其中第i (1≤i≤M)条道路连接了vi,ui两个中转站,那么中转站vi可以通过该道路到达ui中转站,如果切断这条道路,需要代价ci.现在B国想找出一个路径切断方案

ZOJ3792_Romantic Value(网络流/最小割=最大流/找割边)

解题报告 题目传送门 题意: 给出一个无向图,以及起点与终点.要删除一些边使得起点与终点不连通,在删掉边的权值之和最小的情况下要求删除的边数尽量少. 求出一个比值:剩余边数权值和/删除的边数. 思路: 明显的让起点终点达不到就是一个最小割,用最大流可以求出. 但是求割边边数就不会了,没做过最小割的求割边问题. 割边一定是残留网络中零流的边,但零流不一定是割边. 飞神的想法很奇特.链接传送 可以把残留网络的零流的边设成容量为1,其他设成无穷,再求一次最大流.最后流量一定等于割边边数 另外: 还有一

Destroying The Graph 最小点权集--最小割--最大流

Destroying The Graph 构图思路: 1.将所有顶点v拆成两个点, v1,v2 2.源点S与v1连边,容量为 W- 3.v2与汇点连边,容量为 W+ 4.对图中原边( a, b ), 连边 (a1,b2),容量为正无穷大 则该图的最小割(最大流)即为最小花费. 简单证明: 根据ST割集的定义,将顶点分成两个点集.所以对于原图中的边(a,b),转换成 S->a1->b2->T. 则此时路径必定存在 一条割边,因为a1->b2为无穷大,所以割边必定是 S->a1

POJ3469_Dual Core CPU(网络流/最小割=最大流/模版)----Dinic模版2.0

解题报告 题目传送门 题意: 双核CPU,n个模块,每个模块必须运行在某个CPU核心上,每个模块在cpu单核的消耗A和B,M对模块要共享数据,如果在同一个核心上不用消耗,否则需要耗费.安排N个模块,使得总耗费最小 思路: 将两个cpu核心看成源点和汇点,其他模块分别与源点汇点连线(表示每个模块可以在任意cpu上运行),m对模块分别连双向边,要使得模块只能在一个cpu上运行,就是找到一个割,源点和汇点必不联通,耗费最少就是最小割,最小割最大流原理转换成求最大流. 这题数据大,没优化TLE了,加了两

Uva -1515 Pool construction(最小割)

输入一个字符矩阵,'.'代表洞,'#'代表草地.可以把草改成洞花费为d,或者把洞改成草花费为f,最后还要在草和洞之间修围栏花费为b. 首先把最外一圈的洞变成草,并累加花费. 增加一个源点和一个汇点,源点连接每个草地,汇点连接每个洞. 源点与最外一圈的草地连一条容量无穷大的边,与其他草地连一条容量为d的边.表示把这条弧切断,割的容量增加d,草就会变成洞. 每个洞与汇点连一条容量为f的边. 相邻两个格子之间连一条双向边. 用最大流算法求最小割在加上之前把边界上的洞变成草的费用,就是最小花费. 用最小

hiho一下 第119周 #1398 : 网络流五&#183;最大权闭合子图 【最小割-最大流--Ford-Fulkerson 与 Dinic 算法】

#1398 : 网络流五·最大权闭合子图 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 周末,小Hi和小Ho所在的班级决定举行一些班级建设活动. 根据周内的调查结果,小Hi和小Ho一共列出了N项不同的活动(编号1..N),第i项活动能够产生a[i]的活跃值. 班级一共有M名学生(编号1..M),邀请编号为i的同学来参加班级建设活动需要消耗b[i]的活跃值. 每项活动都需要某些学生在场才能够进行,若其中有任意一个学生没有被邀请,这项活动就没有办法进行. 班级建设的活

POJ 3308 Paratroopers (二分图最小点权覆盖 -&gt; 最小割 -&gt; 最大流)

POJ 3308 Paratroopers 链接:http://poj.org/problem?id=3308 题意:有一个N*M的方阵,有L个伞兵降落在方阵上.现在要将所有的伞兵都消灭掉,可以在每行每列装一个高射炮,如果在某行(某列)装上高射炮之后,能够消灭所有落在该行(该列)的伞兵.每行每列安高射炮有费用,问如何安装能够使得费用之积最小. 思路:首先题目要求乘积最小,将乘积对e取对数,会发现就变成了求和.然后抽象出一个二分图,每一行是x部的一个点,每个点有权值,权值为费用取ln.每一列是y部

734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流

?问题描述:在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.?编程任务:对于给定的方格棋盘,按照取数要求编程找出总和最大的数.?数据输入:由文件grid.in提供输入数据.文件第1 行有2 个正整数m和n,分别表示棋盘的行数和列数.接下来的m行,每行有n个正整数,表示棋盘方格中的数. [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白