首页 > 其他分享 >P1345 [USACO5.4] 奶牛的电信Telecowmunication 题解

P1345 [USACO5.4] 奶牛的电信Telecowmunication 题解

时间:2023-08-20 19:13:15浏览次数:38  
标签:奶牛 idx int 题解 电脑 dep add Telecowmunication P1345

P1345 [USACO5.4] 奶牛的电信Telecowmunication

题目描述

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

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

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

对于 \(100\%\) 的数据:\(1\le N \le 100\),\(1\le M \le 600\)。

思路

如果这道题割掉的是边,那么这就是网络流最小割的板子了。

但是这道题求的是边,所以考虑点化边。

我们把一个点拆成入点和出点两个部分,所有连到原点的边都连到入点上,所有从原点连出的边都从出点连,入点和出点直接连一条容量为 \(1\) 的边,如果把原来的边的边权都设为 \(\inf\),就可以做了。。

剩下的就是最小割板子了。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
//#define int long long
using namespace std;
typedef pair<int, int> PII;
typedef long long ll;

const int N = 2e2 + 10, M = 1e5 + 10;

int n, m, S, T, h[N], cur[N], e[M], ne[M], w[M], idx, dep[N];
void add(int a, int b, int c) {
    e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++;
}

bool bfs() {
    memset(dep, 0, sizeof dep), memcpy(cur, h, sizeof h);
    queue<int> q;
    q.push(S);
    dep[S] = 1;
    while(q.size()) {
        int t = q.front();
        q.pop();
        for(int i = h[t]; ~i; i = ne[i]) {
            int j = e[i];
            if(!dep[j] && w[i]) {
                dep[j] = dep[t] + 1;
                q.push(j);
                if(j == T + n) return 1;
            }
        }
    }
    return 0;
}

int dinic(int u, int lim) {
    if(u == T + n) return lim;
    int t = 0;
    for(int i = cur[u]; ~i && t < lim; i = ne[i]) {
        int j = e[i];
        cur[u] = i;
        if(w[i] && dep[j] == dep[u] + 1) {
            int f = dinic(j, min(lim - t, w[i]));
            w[i] -= f, w[i ^ 1] += f, t += f;
        }
    }
    if(!t) dep[u] = 0;
    return t;
}

signed main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    memset(h, -1, sizeof h);
    cin >> n >> m >> S >> T;
    for(int i = 1, a, b; i <= m; i ++) {
        cin >> a >> b;
        add(a, b + n, 1e9), add(b + n, a, 0);
        add(b, a + n, 1e9), add(a + n, b, 0);
    }
    for(int i = 1; i <= n; i ++)
        add(i, i + n, 1), add(i + n, i, 0), add(i + n, i, 1), add(i, i + n, 0);
    int sum = 0;
    while(bfs()) sum += dinic(S, 1e9);
    cout << sum << '\n';

    return 0;
}

标签:奶牛,idx,int,题解,电脑,dep,add,Telecowmunication,P1345
From: https://www.cnblogs.com/MoyouSayuki/p/17643005.html

相关文章

  • P9556 [SDCPC2023] A-Orders 题解
    题目传送门一道模拟题。可以命名一个订单的结构体,然后将订单的结束时间进行排序。用一个变量模拟货物的数量,每遇到一个订单,货物的数量就会加上距离上一个订单的天数乘上\(k\)。即对于第\(i\)个订单,距离第\(i-1\)订单货物数量增加了\((a_{i}-a_{i-1})\timesk\)。如果在模......
  • CSP模拟赛题解
    目录CSP模拟16T1:糖果CSP模拟17T1:弹珠游戏T2:晚会CSP模拟18T1:TheThirdLetterT2:InaoftheMountainCSP模拟19T1:StrangeFunctionT2:DZYLovesModificationCSP模拟21T1:[CEOI2016]kangarooT2:[JOI2023Final]Advertisement2T3:YourCSP模拟22T1:TheChildandToyCSP模拟16T1:......
  • JS习题解析
    1、页面有一个id为button1的按钮,如何通过原生的js禁用?(IE考虑IE8.0以上版本)A、document.getElementById("button1").readonly=true;B、document.getElementById("button1").setAttribute('readonly','true');C、document.getElementById("button1&quo......
  • 题解 Cow and Snacks
    被黄题创死了2333题目链接首先肯定有一个贪心的想法:尽量使得人们拿的花重复,即尽量使得每个人都拿一束花。当然第一个人必须拿两束。接着思考:如何找出有几个人是必须拿两束花的。其实很简单,当\(A,B\)两人不能通过其他人使得他们的花有联系,比如\(A\)喜欢\(1,2\),\(B\)喜欢......
  • 8.20题解
    T1sun暴力枚举即可时间复杂度分析:\((lnx)'=\frac{1}{x}\)根据牛顿-莱布尼茨公式可得:\(\sum_{x=1}^{n}{\frac{1}{x}}=\int_{1}^{n}{\frac{1}{x}}=ln(n)-ln{1}=ln(n)\)令\(ln(n)=k\)可得:\(n=e^{k}<=e^{15}\approx3269017\)T2order首先需要理解题意......
  • CF1656D K-good 题解
    CF1656DK-good题解题目大意给出\(t\)个整数\(n\),对于每一个\(n\)找出一个大于等于\(2\)的整数\(k\),使得\(n\)可以表示成\(k\)个mod\(k\)的结果互不相同的正整数之和。\(1\let\le10^5,2\len\le10^{18}\)。题解我们先将题意再次化简,可以得到,我们实际......
  • P9571 Horizon Blue 题解
    P9571HorizonBlue题解这个题拿平衡树写是不是小题大做了咳咳咳进入正题。首先转化一下题意。第一个操作是加入直线,第二个操作就是求所有斜率不等于\(k\)的直线的数量,第三个操作就是删掉所有斜率不等于\(k\)的和所有与该直线重合的直线。感觉这题完全就是FHQ_Treap的......
  • P9572 Colorful Days♪ 题解
    原题链接题目大意:有两个数组\(S\),\(T\),你可以把\(S\)进行复制并接到其后面形成\(S^k\),如\(S\)=123,则\(S^2\)=123123,\(S^3\)=123123123。让你求出\(S^k\)与\(T\)的最长公共子序列以及在最长公共子序列最长时\(k\)的最小值。首先思考如果无视\(k\)最小的要求,最......
  • P4197 Peaks 题解
    P4197Peaks题解题目描述在Bytemountains有\(n\)座山峰,每座山峰有他的高度\(h_i\)。有些山峰之间有双向道路相连,共\(m\)条路径,每条路径有一个困难值,这个值越大表示越难走。现在有\(q\)组询问,每组询问询问从点\(v\)开始只经过困难值小于等于\(x\)的路径所能到达的......
  • P9571 Horizon Blue 题解
    原题链接题目大意:\(有三个操作,分别为\)\(操作1加入一条直线\)\(操作2查询与一条直线相交但不重合的直线条数\)\(操作3删除所有与一条直线相交或重合的直线\)\(注意:后面两个操作的直线并不需要加入\)\(显然,两条直线相交不重合,当且仅当其k值不同\)\(所以可以把所有直线按k......