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 ...
随机推荐
- Spring Boot 特性 —— SpringApplication
转自:https://blog.csdn.net/cqdz_dj/article/details/52910317
- VBA 字符串处理函数集
转自:http://blog.csdn.net/jyh_jack/article/details/2315345 mid(字符串,从第几个开始,长度) 在[字符串]中[从第几个开始]取出[长度个字符 ...
- javascript必须知道的知识要点(二)
该文章不详细叙述各知识要点的具体内容,仅把要点列出来,供大家学习的时候参照,或者检测自己是否熟练掌握了javascript,清楚各个部分的内容. 内建对象可划分为数据封装类对象.工具类对象.错误类对象 ...
- PCB Genesis加邮票孔(线与弧)实现算法
一.Genesis加邮票孔(线与弧)实现算法 1.鼠标点击位置P点(可以确认搜索区域位置,确认点击位置周边元素分区,此所讲算法未应用到P点坐标) 2.求出:P1C与P2C (线与弧最近点距离的2个点) ...
- python 8:list.sort(reverse=false)、sorted(list, reverse=false)(对列表进行不可恢复排序;对列表进行可恢复排序)
bicycles = ['trek', 'cannondale', 'redline', 'specialized'] print(bicycles) print(sorted(bicycles)) ...
- jquery中的left和top
left 和 top /*1. 获取元素基于定位容器的位置*/ /*返回的是对象 属性 left top */ var position = $('.inner').position(); conso ...
- ajax 三级联动写法
主页面代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 【转载】浏览器缓存详解:expires cache-control last-modified
https://www.cnblogs.com/caiyanhu/p/6931624.html 下面的内容展示了一个常见的 Response Headers,这些 Headers 要求客户端最多缓存 ...
- 02 java学习安装jdk及其环境配置
SUN公司1995年正式推出的一款语言 其实之前,Sun公司1991年,James Gosling等人就开始开发Oak语言,希望用于控制嵌入有效电视交换盒,1994年更名为Java,之前来自 与jav ...
- spotlight on mysql 监控
. 安装 下载地址:https://pan.baidu.com/s/1qYi3lec 官网地址——https://www.quest.com/common/registration.aspx?requ ...