`

POJ 1966 Cable TV Network (EK 最小割)

c 
阅读更多

 

Cable TV Network
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 3442   Accepted: 1602

Description

The interconnection of the relays in a cable TV network is bi-directional. The network is connected if there is at least one interconnection path between each pair of relays present in the network. Otherwise the network is disconnected. An empty network or a network with a single relay is considered connected. The safety factor f of a network with n relays is: 
1. n, if the net remains connected regardless the number of relays removed from the net. 
2. The minimal number of relays that disconnect the network when removed. 

For example, consider the nets from figure 1, where the circles mark the relays and the solid lines correspond to interconnection cables. The network (a) is connected regardless the number of relays that are removed and, according to rule (1), f=n=3. The network (b) is disconnected when 0 relays are removed, hence f=0 by rule (2). The network (c) is disconnected when the relays 1 and 2 or 1 and 3 are removed. The safety factor is 2.

Input

Write a program that reads several data sets from the standard input and computes the safety factor for the cable networks encoded by the data sets. Each data set starts with two integers: 0<=n<=50,the number of relays in the net, and m, the number of cables in the net. Follow m data pairs (u,v), u < v, where u and v are relay identifiers (integers in the range 0..n-1). The pair (u,v) designates the cable that interconnects the relays u and v. The pairs may occur in any order.Except the (u,v) pairs, which do not contain white spaces, white spaces can occur freely in input. Input data terminate with an end of file and are correct.

Output

For each data set, the program prints on the standard output, from the beginning of a line, the safety factor of the encoded net.

Sample Input

0 0
1 0
3 3 (0,1) (0,2) (1,2)
2 0
5 7 (0,1) (0,2) (1,3) (1,2) (1,4) (2,3) (3,4)

Sample Output

0
1
3
0
2

Hint

The first data set encodes an empty network, the second data set corresponds to a network with a single relay, and the following three data sets encode the nets shown in figure 1.

Source

 

 

题目大意:给你一个无向图,这个图有一个安全系数f,
f的定义是:
1.f为n,如果不管删除多少个顶点,剩下的图仍然是连通的
2.f为删除最少的顶点数,使得剩下的图不连通
给你一个图,求出f


解题思路:题目给出的目标很明显,转换成图,那么f就是无向图中的连通度吗,或者说,是求无向图中的最小割点集。
根据Menger定理,这样建图,首先将每个点拆成两个点
每个点可以表示成i与i+n

那么有向边<i,i+n>的容量为1
如果i与j相邻,那么有有向边<i+n,j>=<j+n,i>=INF,等于无穷大

然后固定源点,枚举汇点求最大流。如果最大流都是INF,那么代表这个图是一个完全连通图,最小割点集为n
否则就输出最大流。

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>

using namespace std;

const int VM=110;
const int EM=1010;
const int INF=0x3f3f3f3f;

int map[VM][VM],flow[VM][VM],pre[VM];   //pre[]用于bfs寻找路径

int BFS(int n,int src,int des){
    int res[VM];
    queue<int> q;
    while(!q.empty())
        q.pop();
    memset(res,0,sizeof(res));  //记录增广路最小流量,而且又可以当做广搜的标记数组  
    memset(pre,-1,sizeof(pre)); //记录下这条增广路,以便增流 
    q.push(src);
    res[src]=INF;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(int i=0;i<n;i++)
            if(!res[i] && map[u][i]>flow[u][i]){    //如果这是一条允许弧就记录下来 
                q.push(i);
                pre[i]=u;
                res[i]=min(res[u],map[u][i]-flow[u][i]);
            }
        if(u==des)      //找到增广路退出
            break;
    }
    return res[des];
}

int EK(int n,int src,int des){
    int maxflow=0,tmp;
    memset(flow,0,sizeof(flow));
    while(tmp=BFS(n,src,des)){
        for(int i=des;i!=src;i=pre[i]){     //根据父亲数组更新流量
            flow[i][pre[i]]-=tmp;           //更新反向流
            flow[pre[i]][i]+=tmp;           //更新正向流 
        }
        maxflow+=tmp;
    }
    return maxflow;
}

int main(){

    //freopen("input.txt","r",stdin);

    int n,m;
    while(~scanf("%d%d",&n,&m)){
        memset(map,0,sizeof(map));
        for(int i=0;i<n;i++)
            map[i][i+n]=1;
        int u,v;
        for(int i=0;i<m;i++){
            scanf(" (%d,%d)",&u,&v);
            map[u+n][v]=map[v+n][u]=INF;
        }
        int ans=INF;
        for(int i=1;i<n;i++)
            ans=min(ans,EK(2*n,n,i));
        if(ans==INF)
            ans=n;
        printf("%d\n",ans);
    }
    return 0;
}

 

分享到:
评论

相关推荐

    POJ1459-Power Network

    【标题】"POJ1459-Power Network"是一个编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Set of Peking University)。这个题目主要涉及到图论和算法的应用,特别是广度优先搜索(BFS)以及一种优化技巧——...

    最小割推荐题目源码

    最小割推荐题目源码主要涉及图论中的一个重要概念——最小割问题,以及它在解决推荐系统问题中的应用。最小割问题通常与网络流问题密切相关,是计算机科学领域中图算法的一种经典应用。在这个主题中,我们主要关注...

    POJ2531-Network Saboteur

    【标题】"POJ2531-Network Saboteur" 是一道来自北京大学在线判题系统POJ(Problem Set)的编程题目。该题目属于算法竞赛中的经典问题,旨在考察参赛者的图论知识和编程能力。 【描述】"北大POJ2531-Network ...

    Stoer-Wagner算法求全局最小割(模板)

    在POJ2914题中,提供了Stoer-Wagner 算法的实现代码,该代码使用C++语言编写,使用prim算法计算图的最小割,并输出图的全局最小割结果。 Stoer-Wagner 算法是一种常用的算法,用于计算图的全局最小割,该算法可以...

    最小割题解1

    3. POJ1966是一个寻找图的最小点割集的问题,即找到最少的点数,使得去掉这些点后图变得不连通。这个问题可以通过将每个节点拆分为两个节点,并且添加容量为1的自环,然后求解最大流来转化成最小割问题。 4. POJ...

    poj 1459 Power Network.md

    poj 1459 Power Network.md

    POJ 1861 Network

    【标题】"POJ 1861 Network"是一个经典的计算机科学问题,它涉及到图论中的网络连接,并要求我们利用并查集(Disjoint Set)数据结构来检测图中的环路,同时应用快速排序算法来求解最小生成树。这个问题在ACM(国际...

    poj1251 最小生成树

    标题“poj1251 最小生成树”是一个编程竞赛题目,来源于著名的在线编程平台POJ(Programming Online Judge)。这个题目主要涉及图论中的一个经典算法问题——最小生成树(Minimum Spanning Tree, MST)。在图论中,...

    POJ 1751 求最小生成树prim算法(JAVA)

    标题 "POJ 1751 求最小生成树Prim算法(JAVA)" 提到的是一个编程挑战,涉及图论中的经典算法——Prim算法。在计算机科学中,Prim算法是用于寻找加权无向图的最小生成树的一种有效方法。最小生成树是一棵树形结构,...

    poj题目分类

    * 最小割模型、网络流规约:例如 poj3308。 3. 数据结构: * 线段树:例如 poj2528、poj2828、poj2777、poj2886、poj2750。 * 静态二叉检索树:例如 poj2482、poj2352。 * 树状树组:例如 poj1195、poj3321。 ...

    poj各种分类

    在初级阶段的基础上,中级阶段涵盖了更多复杂的数据结构和算法,如差分约束系统、最小费用最大流、双连通分量、强连通分支、最小割模型等,以及线段树、树状数组、RMQ查询等高级数据结构的应用。这些内容进一步深化...

    POJ2516__最小费用最大流

    poj2516代码最小费用最大流

    POJ算法题目分类

    * 图的深度优先遍历和广度优先遍历:图的深度优先遍历和广度优先遍历是指遍历图的两种方式,如 poj1860、poj3259、poj1062、poj2253、poj1125、poj2240。 * 最短路径算法:最短路径算法是指计算图中两点之间的最短...

    poj训练计划.doc

    - 最小生成树算法:如Prim算法和Kruskal算法,用于找出图中的最小生成树,如`poj1789, poj2485`。 - 拓扑排序:适用于有向无环图,用于确定任务的执行顺序,如`poj1094`。 - 二分图的最大匹配:如匈牙利算法,...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **例题**:poj1860, poj3259, poj1062, poj2253, poj1125, poj2240 - **解释**:最短路径算法包括Dijkstra算法、Bellman-Ford算法、Floyd算法以及堆优化的Dijkstra算法等。 ##### (3) 最小生成树算法 - **例题**...

    POJ第1861题源码POJ第1861题源码POJ第1861题源码POJ第1861题源码

    标题中的"POJ第1861题源码"指的是编程竞赛网站POJ(Programming Online Judge)上的第1861道题目,该题目通常会涉及到一个特定的算法或编程问题,而源码则指的是参赛者提交的解决该问题的程序代码。在描述和标签中...

    poj图论题目汇总

    - **知识点**:最小割算法,用于找到分割图的最小代价切割。 #### 2135 Farm Tour - 费用流 - **知识点**:费用流算法,扩展的网络流算法,用于处理带有成本的流量问题。 #### 2139 Six Degrees of Cowvin Bacon ...

    POJ2195-Going Home【费用流】

    【标题】"POJ2195-Going Home" 是一道来自北京大学在线判题系统POJ的编程题目,主要考察的是运用费用流算法解决实际问题的能力。这道题的中文名称是“回家”,通过题目我们可以推测它可能涉及到路径规划或者资源分配...

    POJ_3131.zip_POJ 八数码_poj

    标题中的“POJ_3131.zip_POJ 八数码_poj”指的是一个与编程竞赛网站POJ(Problem Set Algorithm)相关的项目,具体是针对3131号问题的解决方案,该问题涉及到了八数码游戏。八数码游戏,又称滑动拼图,是一个经典的...

    POJ.rar_poj java_poj1048

    【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...

Global site tag (gtag.js) - Google Analytics