POJ 1966
求的是无向图的点连通度。开始便想到网络流,既然选的是点,当然就要拆点加边了。但无论如何也不敢往枚举源汇点的方向想,因为网络流复习度很高。看看网上大牛的,都是枚举,再看数据,原来N才50个点,枚举无压力啊。看来自己以后要注意分析一下复杂度了。
总结:
1)无向图点连通度
看来没有什么好的算法。网络流。把点i拆成i->i‘容量自然是1,把无向图的边也拆成两条有向边i'->j,j'->i,容量为无穷。然后,枚举求s'->t的最小割就可了。
2)有向图点连通度
这个更简单了,单纯拆点建图就可以了。
3)无向图边连通度。
可以用store-wanger求最小割。边权为1
4)有向图边连通度
就是网络流求最小割
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int INF=0x3f3f3f3;
const int MAXN= ;
const int MAXM=; struct Node{
int from,to,next;
int cap;
}edge[MAXM];
int tol; int dep[MAXN];
int head[MAXN];
bool maze[MAXN][MAXN];
int n,m;
void init(){
tol=;
memset(head,-,sizeof(head));
}
void addedge(int u,int v,int w){
edge[tol].from=u;
edge[tol].to=v; edge[tol].cap=w; edge[tol].next=head[u];
head[u]=tol++;
edge[tol].from=v;
edge[tol].to=u;
edge[tol].cap=;
edge[tol].next=head[v];
head[v]=tol++;
} int BFS(int start,int end){
int que[MAXN];
int front,rear; front=rear=;
memset(dep,-,sizeof(dep));
que[rear++]=start;
dep[start]=;
while(front!=rear){
int u=que[front++];
if(front==MAXN)front=;
for(int i= head[u];i!=-; i=edge[i].next){
int v=edge[i].to;
if(edge[i].cap>&& dep[v]==-){
dep[v]=dep[u]+;
que[rear++]=v;
if(rear>=MAXN) rear=;
if(v==end)return ;
}
}
}
return ;
}
int dinic(int start,int end){
int res=;
int top;
int stack[MAXN];
int cur[MAXN];
while(BFS(start,end)){
memcpy(cur,head, sizeof(head));
int u=start;
top=;
while(){
if(u==end){
int min=INF;
int loc;
for(int i=;i<top;i++)
if(min>edge [stack[i]].cap) {
min=edge [stack[i]].cap;
loc=i;
}
for(int i=;i<top;i++){
edge[stack[i]].cap-=min;
edge[stack[i]^].cap+=min;
}
res+=min;
top=loc;
u=edge[stack[top]].from;
}
for(int i=cur[u]; i!=-; cur[u]=i=edge[i].next)
if(edge[i].cap!= && dep[u]+==dep[edge[i].to])
break;
if(cur[u] !=-){
stack [top++]= cur[u];
u=edge[cur[u]].to;
}
else{
if(top==) break;
dep[u]=-;
u= edge[stack [--top] ].from;
}
}
}
return res;
} void build(){
init();
for(int i=;i<n;i++){
for(int j=;j<n;j++){
if(i==j)
addedge(i*,i*+,);
else if(maze[i][j]){
addedge(i*+,j*,INF);
}
}
} } int main(){
int u,v;
while(scanf("%d%d",&n,&m)!=EOF){
memset(maze,false,sizeof(maze));
for(int i=;i<m;i++){
scanf(" (%d,%d)",&u,&v);
maze[u][v]=maze[v][u]=true;
}
int ans=INF;
for(int i=;i<n;i++){
for(int j=i+;j<n;j++){
build();
if(!maze[i][j]){
int res=dinic(i*+,j*);
if(res<ans) ans=res;
if(ans==) break;
}
}
if(ans==) break;
}
if(ans>=n){ printf("%d\n",n); continue; }
printf("%d\n",ans);
}
return ;
}
POJ 1966的更多相关文章
- poj 1966(求点连通度,边连通度的一类方法)
题目链接:http://poj.org/problem?id=1966 思路:从网上找了一下大牛对于这类问题的总结:图的连通度问题是指:在图中删去部分元素(点或边),使得图中指定的两个点s和t不连通 ...
- POJ 1966:Cable TV Network(最小点割集)***
http://poj.org/problem?id=1966 题意:给出一个由n个点,m条边组成的无向图.求最少去掉多少点才能使得图中存在两点,它们之间不连通. 思路:将点i拆成a和b,连一条a-&g ...
- POJ 1966 Cable TV Network
Cable TV Network Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4702 Accepted: 2173 ...
- uva 1660 & poj 1966(点连通度)
Cable TV Network Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4267 Accepted: 2003 ...
- POJ 1966 Cable TV Network(顶点连通度的求解)
Cable TV Network Time Limit: 1000MS Memory Limit: 30000K Total Submissi ...
- POJ 1966 Cable TV Network (无向图点连通度)
[题意]给出一个由n个点,m条边组成的无向图.求最少去掉多少点才能使得图中存在两点,它们之间不连通. [思路]回想一下s->t的最小点割,就是去掉多少个点能使得s.t不连通.那么求点连通度就枚举 ...
- poj 1966 Cable TV Network 顶点连通度
题目链接 给一个图, n个点m条边, 求至少去掉多少个点可以使得图不再联通.随便指定一个点为源点, 枚举其他点为汇点的情况, 跑网络流, 求其中最小的情况. 如果最后ans为inf, 说明是一个完全图 ...
- POJ 1966 ZOJ 2182 Cable TV Network
无向图顶点连通度的求解,即最少删除多少个点使无向图不连通. 我校“荣誉”出品的<图论算法理论.实现及其应用>这本书上写的有错误,请不要看了,正确的是这样的: 对于每个顶点,分成两个点,v和 ...
- POJ 1966 Cable TV Network (点连通度)【最小割】
<题目链接> 题目大意: 给定一个无向图,求点连通度,即最少去掉多少个点使得图不连通. 解题分析: 解决点连通度和边连通度的一类方法总结见 >>> 本题是求点连通度, ...
- POJ 1966 Cable TV Network (算竞进阶习题)
拆点+网络流 拆点建图应该是很常见的套路了..一张无向图不联通,那么肯定有两个点不联通,但是我们不知道这两个点是什么. 所以我们枚举所有点,并把每个点拆成入点和出点,每次把枚举的两个点的入点作为s和t ...
随机推荐
- B2568 比特集合 树状数组
啊啊啊,跳题坑死人.抽了一道国集的题,自己瞎编了一个算法,好像过不了而半途而废.转去看题解,发现用二维树状数组维护一下,偏移量我倒是想对了,但是维护的东西和我的完全不一样.还是有很大差距啊... 题解 ...
- bzoj 1026 [ SCOI2009 ] windy数 —— 数位DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1026 蛮简单的数位DP,预处理 f[i][j] 表示 i 位数,以 j 开头的 windy ...
- Newtonsoft.Json 序列化日期问题解决
上代码 其中的使用方法和UserInfo实体对象就不贴代码了. /// <summary> /// 把对象转成json字符串 /// </summary> /// <pa ...
- POJ 2688 Cleaning Robot
题意: 给你一个n*m的图.你从'o'点出发,只能走路(图中的'.')不能穿墙(图中的'x'),去捡垃圾(图中的' * ')问最少走多少步能捡完所有垃圾,如有垃圾捡不了,输出-1. 思路: 有两个思路 ...
- java实现读取yaml文件,并获取值
首先在项目src目录下新建一个test.yaml的文件. 代码如下: spring: application: name: cruncher datasource: driverClassName: ...
- 基于artDialog的扩展
/* * * 引用此文件必须引用以下两个资源文件,并且还要引用jQuery * <link href="ui-dialog.css" rel="stylesheet ...
- Android 使用SQLite存储以及读取Drawable对象
在进行Android开发过程中,我们经常会接触到Drawable对象,那么,若要使用数据库来进行存储及读取,该如何实现? 一.存储 //第一步,将Drawable对象转化为Bitmap对象 Bitma ...
- JDBC: 批量处理提高SQL处理速度
引用:忘了 当需要成批插入或者更新记录时.可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理.通常情况下比单独提交处理更有效率 JDBC的批量处理语句包括下面两个方法: a ...
- Java_Web之俱乐部会员信息管理系统
使用 Jsp实现俱乐部会员信息管理功能,orac1e11g作为后台数据库,该系统包括查看俱乐部会员信息列表和修改俱乐部会员信息两人功能,具体耍求如下: 打开俱乐部会员信息列表页面,以列表方式显示所有俱 ...
- OpenCV中IplImage/CvMat/Mat转化关系
原文链接:http://www.cnblogs.com/summerRQ/articles/2406109.html 如对内容和版权有何疑问,请拜访原作者或者通知本人. opencv中常见的与图像操作 ...