• [LuoguP1345] 奶牛的电信Telecowmunication


    题目描述

    农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流。这些机器用如下的方式发送电邮:如果存在一个由c台电脑组成的序列a1,a2,...,a(c),且a1与a2相连,a2与a3相连,等等,那么电脑a1和a(c)就可以互发电邮。

    很不幸,有时候奶牛会不小心踩到电脑上,农夫约翰的车也可能碾过电脑,这台倒霉的电脑就会坏掉。这意味着这台电脑不能再发送电邮了,于是与这台电脑相关的连接也就不可用了。

    有两头奶牛就想:如果我们两个不能互发电邮,至少需要坏掉多少台电脑呢?请编写一个程序为她们计算这个最小值。

    以如下网络为例:

    1* / 3 - 2*

    这张图画的是有2条连接的3台电脑。我们想要在电脑1和2之间传送信息。电脑1与3、2与3直接连通。如果电脑3坏了,电脑1与2便不能互发信息了。

    输入格式

    第一行 四个由空格分隔的整数:N,M,c1,c2.N是电脑总数(1<=N<=100),电脑由1到N编号。M是电脑之间连接的总数(1<=M<=600)。最后的两个整数c1和c2是上述两头奶牛使用的电脑编号。连接没有重复且均为双向的(即如果c1与c2相连,那么c2与c1也相连)。两台电脑之间至多有一条连接。电脑c1和c2不会直接相连。

    第2到M+1行 接下来的M行中,每行包含两台直接相连的电脑的编号。

    输出格式

    一个整数表示使电脑c1和c2不能互相通信需要坏掉的电脑数目的最小值。

    输入输出样例

    输入 #1
    3 2 1 2
    1 3
    2 3
    输出 #1
    1

    水题
    拆点容量为一,原图中的边容量为INF,最小割所在的边对应到原图即位被删除的点
    #include <bits/stdc++.h>
    using namespace std;
    const int INF = 1 << 30;
    const int maxn = 200 + 10, maxm = 5000;
    class Edge{
    public:
        int v, w, next;
        Edge(){}
        Edge(int v, int w, int next): v(v), w(w), next(next){}
    }e[maxm];
    int fir[maxn] = {}, cur[maxn], ecnt = 1;
    inline void add(int u, int v, int w){
        e[++ecnt] = Edge(v, w, fir[u]); fir[u] = ecnt;
    }
    inline void ins(int u, int v, int w){
        add(u, v, w); add(v, u, 0);
    }
    int S, T;
    int vis[maxn], bfn = 0, lev[maxn];
    int q[maxn], head, tail;
    inline bool bfs(){
        head = tail = 0;
        q[tail++] = S;
        vis[S] = ++ bfn;
        lev[S] = 1;
        while(head != tail){
            for(int i = fir[q[head]]; i; i = e[i].next){
                if(!e[i].w || vis[e[i].v] == bfn) continue;
                vis[e[i].v] = bfn;
                lev[e[i].v] = lev[q[head]] + 1;
                q[tail++] = e[i].v;
                if(tail == 201) tail = 0;
            }
            head++;
            if(head == 201) head = 0;
        }
        return vis[T] == bfn;
    }
    int dfs(int u, int maxf){
        if(u == T) return maxf;
        int ret = 0, t;
        for(int &i = cur[u]; i; i = e[i].next){
            if(!e[i].w || lev[e[i].v] != lev[u] + 1) continue;
            t = dfs(e[i].v, min(maxf, e[i].w));
            ret += t;
            maxf -= t;
            e[i].w -= t;
            e[i ^ 1].w += t;
            if(!maxf) break;
         }
         if(!ret) lev[u] = -1;
         return ret;
    }
    int main(){
        int n, m;
        cin >> n >> m >> S >> T;
        for(int i = 1; i <= n; i++){
            ins(i, i + n, 1);
        }
        int u, v;
        for(int i = 1; i <= m; i++){
            cin >> u >> v;
            ins(u + n, v, INF);
            ins(v + n, u, INF);
        }
        int ans = 0;
        while(bfs()){
            memcpy(cur, fir, sizeof fir);
            ans += dfs(S + n, INF);
        }
        cout << ans << endl;
        return 0;
    }
  • 相关阅读:
    Spring AOP实现方式一【附源码】
    Java-Swing嵌入浏览器(二)
    Java-Swing嵌入浏览器(一)
    JAVA实现word doc docx pdf excel的在线浏览
    湿空气性质计算,随笔与学习记录(合订)
    湿空气性质计算,随笔与学习记录 (5.空气比焓)
    湿空气性质计算,随笔与学习记录 (4.空气比容,空气密度)
    湿空气性质计算,随笔与学习记录 (3.露点温度,绝对湿度)
    湿空气性质计算,随笔与学习记录(2.水蒸气分压,含湿量,相对湿度)
    湿空气性质计算,随笔与学习记录(1.饱和水蒸气压力计算)
  • 原文地址:https://www.cnblogs.com/ruoruoruo/p/12098684.html
Copyright © 2020-2023  润新知