poj 1966 Cable TV Network 点联通度

简介:

    求点联通度,就是求图中最大独立轨的最小值,把点拆成2个v',v'',v‘->v''容量为1,u-v的一条边就变为u''->v'和v''->u'两个容量为无穷的边,求s‘’ 到e'最大流即可

    第一次写dinic,没带当前弧优化,但对这题来说时间已经够了


/*
author:jxy
lang:C/C++
university:China,Xidian University
**If you need to reprint,please indicate the source**
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
using namespace std;
#define inf 1E9
int c[105][105],f[105][105];
int s,e;
int n;
int ans=0;
int vis[105];
int level[105];
queue<int> q;
int bfs()
{
    while(!q.empty())q.pop();
    q.push(s);
    memset(level,0,sizeof(level));
    level[s]=1;
    int u,v;
    while(!q.empty())
    {
        u=q.front();
        q.pop();
        for(v=0; v<n; v++)
        {
            if(!level[v]&&c[u][v]>f[u][v])
                level[v]=level[u]+1,q.push(v);
        }
    }
    return level[e];//gap
}
int dfs(int v,int flow)
{

    if(!flow)return 0;
    if(v==e)
    {
        ans+=flow;
        return flow;
    }
    int t,last=flow;
    for(int u=0; u<n; u++)
    {
        if((level[u]==level[v]+1)&&c[v][u]>f[v][u])//最短增广路
        {
            t=dfs(u,min(flow,c[v][u]-f[v][u]));
            f[v][u]+=t;
            f[u][v]-=t;
            flow-=t;
            if(!flow)break;
        }
    }
    return last-flow;
}
int main()
{
    int m;
    while(~scanf("%d%d",&n,&m))
    {
        int i,j,a,b;
        memset(c,0,sizeof(c));
        memset(f,0,sizeof(f));
        for(i=0; i<n; i++)
            c[i+n][i]=1;
        for(i=0; i<m; i++)
        {
            scanf(" (%d,%d)",&a,&b);
            c[b][a+n]=c[a][b+n]=inf;//拆点
        }
        n=n<<1;
        ans=0;
        memset(vis,0,sizeof(vis));
        int t=n/2,Max=t;
        for(i=0; i<t; i++)
            for(j=i+t+1; j<n; j++)
            {
                if(c[i][j])continue;
                memset(f,0,sizeof(f));
                e=j;
                s=i;
                ans=0;
                while(bfs())dfs(i,inf);
                Max=min(ans,Max);
            }
        printf("%d\n",Max);
    }
}





目录
相关文章
|
算法
(模拟队列)(bfs版flood fill算法)全球变暖
(模拟队列)(bfs版flood fill算法)全球变暖
60 0
|
数据安全/隐私保护
PTA 1076 Wifi密码 (15 分)
下面是微博上流传的一张照片:“各位亲爱的同学们,鉴于大家有时需要使用 wifi,又怕耽误亲们的学习,现将 wifi 密码设置为下列数学题答案:A-1;B-2;C-3;D-4;请同学们自己作答,每两日一换。
182 0
|
算法 容器
[leetcode] 连接所有点的最小费用 -MST
这道题是最小生成树板子题 可以用并查集实现,贪心排序边权 讲一个二元组放在一个vector容器里面,其中的元素为<weight,<u,v>>对应<int,<int,int> >类型,第一个参数代表边权的大小,后面的为两个点u,v,然后按照第一个值边权从小到大排序,然后用并查集实现是否连通,从而实现最小生成树 代码有点套娃(
85 0
[leetcode] 连接所有点的最小费用 -MST
[UVA1364 | POJ | NC]Knights of the Round Table | Tarjan 求点双 | 二分图 | 综合图论
我们可以很轻松地发现,被提出的都是在点双连通分量之外的,比如该图中的1 和 5 ,那么怎么判断哪些点不在环中呢? 此时我们还可以逆向思考,不 在 环 中 的 = = 总 的 − 在 环 中 的,所以说现在问题就转换成了满足条件的环内的点的个数
106 0
[UVA1364 | POJ | NC]Knights of the Round Table | Tarjan 求点双 | 二分图 | 综合图论
|
安全 算法 物联网
阿里云Link ID² 安全领域再拿殊荣
商用密码应用安全性评估(简称密评)工作是密码检测认证体系的重要组成部分,12月26日,阿里云Link ID²物联网设备身份认证服务平台荣获商用密码应用安全性评估基本符合结论报告,成为阿里巴巴集团首款获得该结论的产品。
581 0
阿里云Link ID² 安全领域再拿殊荣