题目大意:给一张n个点、m条边的无向图,求最小点割集的基数。

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

代码如下:

# include<iostream>
# include<cstdio>
# include<vector>
# include<queue>
# include<cstring>
# include<algorithm>
using namespace std; const int INF=1<<30;
const int maxn=105; struct Edge
{
int fr,to,cap,fw;
Edge(int fr,int to,int cap,int fw){
this->fr=fr;
this->to=to;
this->cap=cap;
this->fw=fw;
}
};
struct Dinic
{
vector<Edge>edges;
vector<int>G[maxn];
int d[maxn],cur[maxn];
int vis[maxn],n,s,t; void init(int n)
{
this->n=n;
edges.clear();
for(int i=0;i<n;++i) G[i].clear();
} void addEdge(int u,int v,int cap)
{
edges.push_back(Edge(u,v,cap,0));
edges.push_back(Edge(v,u,0,0));
int m=edges.size();
G[u].push_back(m-2);
G[v].push_back(m-1);
} bool bfs()
{
memset(vis,0,sizeof(vis));
vis[s]=1;
d[s]=0;
queue<int>q;
q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=0;i<G[u].size();++i){
Edge& e=edges[G[u][i]];
if(e.cap>e.fw&&!vis[e.to]){
vis[e.to]=1;
d[e.to]=d[u]+1;
q.push(e.to);
}
}
}
return vis[t];
} int dfs(int u,int a)
{
if(u==t||a==0) return a;
int flow=0,f;
for(int &i=cur[u];i<G[u].size();++i){
Edge& e=edges[G[u][i]];
if(d[e.to]==d[u]+1&&(f=dfs(e.to,min(a,e.cap-e.fw)))>0){
e.fw+=f;
edges[G[u][i]^1].fw-=f;
flow+=f;
a-=f;
if(a==0) break;
}
}
return flow;
} int maxFlow(int s,int t)
{
this->s=s,this->t=t;
int flow=0;
while(bfs()){
memset(cur,0,sizeof(cur));
flow+=dfs(s,INF);
}
return flow;
}
};
Dinic solver;
string p;
int n,m,mark[55];
vector<Edge>E; void addEdge(int u,int v,int cap)
{
E.push_back(Edge(u,v,cap,0));
} void solve()
{
int len=p.size(),pos;
for(pos=0;pos<len;++pos)
if(p[pos]==',') break;
int a=0,b=0;
for(int i=1;i<pos;++i)
a=a*10+p[i]-'0';
for(int i=pos+1;i<len-1;++i)
b=b*10+p[i]-'0';
addEdge(a<<1|1,b<<1,INF);
addEdge(b<<1|1,a<<1,INF);
} void look()
{
for(int i=0;i<solver.edges.size();++i){
Edge& e=solver.edges[i];
cout<<e.fr<<' '<<e.to<<' '<<e.cap<<' '<<e.fw<<endl;
}
} int main()
{
int a,b;
while(~scanf("%d%d",&n,&m))
{
E.clear();
for(int i=0;i<n;++i) addEdge(i<<1,i<<1|1,1);
while(m--)
{
cin>>p;
solve();
}
//look();
int ans=n,k=E.size();
for(int i=1;i<n;++i){
solver.init(n*2);
for(int j=0;j<k;++j){
solver.addEdge(E[j].fr,E[j].to,E[j].cap);
}
int flow=solver.maxFlow(1,i<<1);
ans=min(ans,flow);
}
printf("%d\n",ans);
}
return 0;
}

  

UVA-1660 Cable TV Network (最小割)的更多相关文章

  1. UVa 1660 Cable TV Network (最大流,最小割)

    题意:求一个无向图的点连通度. 析:把每个点拆成两个,然后中间连接一个容量为1的边,然后固定一个源点,枚举每个汇点,最小割. 代码如下: #pragma comment(linker, "/ ...

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

    题意:给一个无向图,求其点连通度?(注意输入问题) 思路: 如果只有1个点,那么输出“1”: 如果有0条边,那么输出“0”: 其他情况:用最大流解决.下面讲如何建图: 图的连通度问题是指:在图中删去部 ...

  3. UVA 1660 Cable TV Network

    题意: 求一个无向图的点连通度. 分析: 把一个点拆成一个入点和一个出点,之间连一条容量为1的有向边,表示能被用一次.最大流求最小割即可.套模板就好 代码; #include <iostream ...

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

    https://vjudge.net/problem/UVA-1660 题意:给出一个无向图,求出点连通度.即最少删除多少个点,使得图不连通. 思路: 如果求线连通度的话,直接求个最大流就可以了.但这 ...

  5. POJ 1966 Cable TV NETWORK(网络流-最小点割集)

                                    Cable TV NETWORK The interconnection of the relays in a cable TV net ...

  6. POJ 1966 Cable TV Network

    Cable TV Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4702   Accepted: 2173 ...

  7. POJ 1966 Cable TV Network(顶点连通度的求解)

                               Cable TV Network Time Limit: 1000MS   Memory Limit: 30000K Total Submissi ...

  8. UVA1660 电视网络 Cable TV Network

    题目地址:UVA1660 电视网络 Cable TV Network 枚举两个不直接连通的点 \(S\) 和 \(T\) ,求在剩余的 \(n-2\) 个节点中最少去掉多少个可以使 \(S\) 和 \ ...

  9. Cable TV Network 顶点连通度 (最大流算法)

    Cable TV Network 题目抽象:给出含有n个点顶点的无向图,给出m条边.求定点联通度   K 算法:将每个顶点v拆成 v'   v''  ,v'-->v''的容量为1.       ...

  10. POJ 1966 Cable TV Network 【经典最小割问题】

    Description n个点的无向图,问最少删掉几个点,使得图不连通 n<=50 m也许可以到完全图? Solution 最少,割点,不连通,可以想到最小割. 发现,图不连通,必然存在两个点不 ...

随机推荐

  1. Oracle管理监控之段空间利用监控-oracle性能优化

    SELECT S.OWNER,       S.SEGMENT_NAME,       S.SEGMENT_TYPE,       S.PARTITION_NAME,       ROUND(BYTE ...

  2. D. Little Artem and Dance---cf669D(模拟)

    题目链接:http://codeforces.com/problemset/problem/669/D 给你n个数,一开始是1 2 3 4 5 6 ... n 这样的 现在有两个操作,第一个操作是所有 ...

  3. supervisor - Python进程管理工具(转)

    add by zhj: 下面是在ubuntu上的一些使用经验 1. 简介 supervisor有两个组件:supervisord和supervisorctl,组成了client/server结构. s ...

  4. windows下安装redis(转)

    add by zhj: redis相比memcached相比,性能上并没有绝对的优势.我们用redis的是因为它支持更多的数据类型,而且在分配给redis的内存用满了之后, redis也不会删除没有过 ...

  5. Python总结篇——知识大全

    python基础 Python开发环境搭建 Python变量和基本数据类型 python基本数据类型之操作 python的语法规范及for和while python编码 python文件操作 pyth ...

  6. CSS伪代码

    /*在p之后插入我是好人*/ p.first:after { content: "好人" } /*在p之前插入亲爱的朋友men*/ p:before { content: &quo ...

  7. centos LB负载均衡集群 三种模式区别 LVS/NAT 配置 LVS/DR 配置 LVS/DR + keepalived配置 nginx ip_hash 实现长连接 LVS是四层LB 注意down掉网卡的方法 nginx效率没有LVS高 ipvsadm命令集 测试LVS方法 第三十三节课

    centos   LB负载均衡集群 三种模式区别 LVS/NAT 配置  LVS/DR 配置  LVS/DR + keepalived配置  nginx ip_hash 实现长连接  LVS是四层LB ...

  8. Windows 10 升级软件 Windows 10 易升

    进入 https://www.microsoft.com/zh-cn/software-download/windows10 点立即更新,弹出如下下载地址. https://download.micr ...

  9. AE Scene开发中的观察者模式

    AE SceneGraph中的观察者模式 注意SceneControl不是观察者,它只是一个SceneGraph的拥有者:SceneViewer才是观察者,SceneGraph是被观察对象,同时观察者 ...

  10. 离线安装部署zabbix

    一. 安装好CentOS安装过程中添加php,mariadb等所需要的依赖 二. 准备好所有所需的rpm压缩文件包在centos中解压,这里放在根目录下zabbix_rpms文件夹下 三. 安装所需r ...