Uva1660 (点联通度、边联通度问题)
题意:
给定一个n(n<=50)的无向图,问最小删去几个点,可以使得这个图不连通
解法:
1. 基本概念
(1)一个具有 N 个顶点的图,在去掉任意 K-1 个顶点后 (1<=K<=N) 所得的子图仍连通,而去掉 K 个顶点后的图不连通则称 G 是连通的, 那么K 称作图 G 的点连通度
(2)相应地如果至少去掉 K 条边使这个图不连通,则 K 成为图的边连通度
2. 求解思路
- 对于求解边联通度的问题,为每条边赋权值为1,然后求确定一点作为源点,枚举此点外的每个点作为汇点求最大流。
- 点联通度问题可以转换到边联通度问题上来,具体转换方法如下
若 G 为无向图,假设有n个点:
(1) 原 G 图中的每个顶点 v 变成两个顶点 v' 和 v+n ,顶点 v 至 v+n 有一条弧(有向边)连接,弧容量为 1;
(2) 原 G 图中的每条边 e = uv ,连一条 u+n 到 v 的弧,再连一条 v+n 到 u 的弧,容量均为INF
(3) A” 为源顶点, B' 为汇顶点
注意:弧是有向边
若 G 为有向图,假设有n个点:
(1) 原 G 图中的每个顶点 v 变成两个顶点 v' 和 v+n ,顶点 v 至 v+n 有一条弧(有向边)连接,弧容量为 1;
(2) 原 G 图中的每条弧 e = uv 变成一条有向轨 u'u"v'v" ,其中轨上的弧 u"v' 的容量为 ∞;
(3) A” 为源顶点, B' 为汇顶点
- 指定一个源点 A" ,枚举汇点B',求 A" 到 B' 的最大流 F
#include<bits/stdc++.h>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define MEM(a,x) memset(a,x,sizeof(a))
#define INF 0x3f3f3f3f
#define MAXN 300+10
using namespace std;
struct Edge {
int from, to, cap, flow;
};
struct Dinic {
int n, m, s, t;
vector<Edge>edges;
vector<int>G[MAXN];
bool vis[MAXN];
int d[MAXN];
int cur[MAXN];
void init() {
for (int i = ; i < MAXN; i++) G[i].clear();
edges.clear();
memset(d, , sizeof(d));
}
void AddEdge(int from, int to, int cap) {
edges.push_back({ from, to, cap, });
edges.push_back({ to, from, , });
m = edges.size();
G[from].push_back(m - );
G[to].push_back(m - );
}
bool BFS() {
int x, i;
memset(vis, , sizeof(vis));
queue<int>Q;
Q.push(s);
d[s] = ;
vis[s] = ;
while (!Q.empty()) {
x = Q.front(), Q.pop();
for (i = ; i < G[x].size(); i++) {
Edge & e = edges[G[x][i]];
if (!vis[e.to] && e.cap > e.flow) {
vis[e.to] = ;
d[e.to] = d[x] + ;
Q.push(e.to);
}
}
}
return vis[t];
}
int DFS(int x, int a) {
if (x == t || a == )
return a;
int flow = , f;
for (int &i = cur[x]; i < G[x].size(); i++) {
Edge & e = edges[G[x][i]];
if (d[x] + == d[e.to] && (f = DFS(e.to, min(a, e.cap - e.flow))) > ) {
e.flow += f;
edges[G[x][i] ^ ].flow -= f;
flow += f;
a -= f;
if (a == )
break;
}
}
return flow;
}
int Maxflow(int s, int t) {
this->s = s, this->t = t;
int flow = ;
while (BFS()) {
memset(cur, , sizeof(cur));
flow += DFS(s, INF);
}
return flow;
}
}Men;
int c[][];
int main() {
int n, m;
while (scanf("%d%d", &n, &m) != EOF) {
if (n == ) { puts(""); continue; }
else if (n == ) { puts(""); continue; }
else if (m == ) { puts(""); continue; }
Men.init();
int u, v, uu, vv;
MEM(c, );
REP(i, , n) Men.AddEdge(i, i + n, );
REP(i, , m) {
scanf(" (%d,%d)", &u, &v);
uu = u + n; vv = v + n;
Men.AddEdge(uu, v, INF); Men.AddEdge(vv, u, INF);
}
int ans = INF;
vector<Edge>o=Men.edges;
REP(i, , n) {
Men.edges = o;
ans = min(ans, Men.Maxflow(n, i));
}
printf("%d\n", ans == INF ? n: ans);
}
return ;
}
Uva1660 (点联通度、边联通度问题)的更多相关文章
- C语言实现二叉树中统计叶子结点的个数&度为1&度为2的结点个数
算法思想 统计二叉树中叶子结点的个数和度为1.度为2的结点个数,因此可以参照二叉树三种遍历算法(先序.中序.后序)中的任何一种去完成,只需将访问操作具体变为判断是否为叶子结点和度为1.度为2的结点及统 ...
- C. Multi-Subject Competition 思维+前缀和+填表加减复杂度(复杂度计算错误)
题意: 给出n个学生 m类题目 每个人会做s[i]类的题 并且做这个题的能力为r[i] 组成一个竞赛队 要求可以选择一些题目 在竞赛队中 擅长每一个题目的 人数要均等 求max(sigma(r[ ...
- 【强联通图 | 强联通分量】HDU 1269 迷宫城堡 【Kosaraju或Tarjan算法】
为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明 ...
- python 度分秒转度
#必须是u类型==================u==================== by gisoracle def dmstod(dms): #arcpy.AddMessage(" ...
- bzoj2200拓扑排序+最短路+联通块
自己写的不知道哪里wa了,明明和网上的代码差不多.,. /* 给定一张图,有的边是无向边,有的是有向边,有向边不会出现在环中,且有可能是负权值 现在给定起点s,求出s到其余所有点的最短路长度 任何存在 ...
- 联通光纤上网配置+华为HG8240光猫+TL-WR842N
最近搬家改用北京联通宽带,光纤入户的那种.联通送的光猫是华为HG8240,没看到天线,应该是不带无线路由.然后自己再买了个TP-Link的TL-WR842N,用来组局域网,也供ipad.kindle. ...
- Open gl 的不规则图形的4联通种子递归填充和扫描线种子递归填充算法实现
实验题目:不规则区域的填充算法 实验目的:验证不规则区域的填充算法 实验内容:利用VC与OpenGL,实现不规则区域的填充算法. 1.必做:实现简单递归的不规则区域填充算法. 2.选做:针对简单递归算 ...
- IOS 特定于设备的开发:检查设备接近度和电池状态
UIDevice类提供了一些API,使你能够跟踪设备的特征,包括电池的状态和接近度传感器.他们二者都以通知的形式提供更新,可以订阅他们,以便在有重要的更新时通知你的应用程序. 1>启动和禁用接近 ...
- SQL Server相似度比较函数
原文:SQL Server相似度比较函数 相似度函数 概述 最近有人问到关于两个字段求相似度的函数,所以就写了一篇关于相似度的函数,分别是“简单的模糊匹配”,“顺序匹配”,“一对一位置匹配”.在 ...
- R语言︱SNA-社会关系网络—igraph包(中心度、中心势)(二)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- SNA社会关系网络分析中,关键的就是通过一些指 ...
随机推荐
- 【干货】国外程序员整理的 C++ 资源大全–日常工作,我觉得用处确实很大,所以分享
考到群里的纯技术文章比较少,发一篇,其实不限于C++可用,这些东西 百度文库链接10 百度云下载15 我个人感觉很有用的,因为其中有些东西时 头儿让我在项目里用的 关于 C++ 框架.库和资源的一些 ...
- 关于android 中WebView使用Css
demo private static final String linkCss = "<link rel=\"stylesheet\" href=\"f ...
- 你都这么拼了,面试官TM怎么还是无动于衷
面试,对于每个人而然并不陌生,可以说是必须经历的一个过程了,小到一场考试,大到企业面试,甚至大型选秀...... 有时自己明明很努力了,但偏偏会在面试环节出了插曲,比如,紧张就是最容易出现的了. 我相 ...
- BZOJ 1042 [HAOI2008]硬币购物(完全背包+容斥)
题意: 4种硬币买价值为V的商品,每种硬币有numi个,问有多少种买法 1000次询问,numi<1e5 思路: 完全背包计算出没有numi限制下的买法, 然后答案为dp[V]-(s1+s2+s ...
- python之sorted用法
operator.itemgetter函数 operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号),下面看例子. a = [1, ...
- Go语言实现:【剑指offer】把数组排成最小的数
该题目来源于牛客网<剑指offer>专题. 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字 ...
- 编辑crontab添加Linux计划任务
在做实验楼的比赛时的题目 用到了crontable 1. 为用户shiyanlou添加一个计划任务 2. 每天凌晨2点定时执行 3. 将/var/log/dpkg.log /var/log/mysql ...
- (转载)Linux平台下安装 python 模块包
https://blog.csdn.net/aiwangtingyun/article/details/79121145 一.安装Python Windows平台下: 进入Python官网下载页面下载 ...
- mysql 查询指定数据库所有表, 指定表所有列, 指定列所有表 所有外键及索引, 以及索引的创建和删除
查询指定 数据库 中所有 表 (指定数据库的,所有表) // 可以把 TABLE_NAME 换成 * 号, 查看更丰富的信息 SELECT TABLE_NAME FROM information_sc ...
- 【WPF学习】第四十八章 理解WPF动画
在许多用户框架中(特别是WPF之前的框架,如Windows窗体和MFC),开发人员必须从头构建自己的动画系统.最常用的技术是结合使用计时器和一些自定义的绘图逻辑.WPF通过自带的基于属性的动画系统,改 ...