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

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

时间:2023-04-27 21:33:36浏览次数:42  
标签:cnt int 题解 u1 v1 add edge Telecowmunication P1345

一、题目描述:

  n 个点,m 条边,给定起点 s 和终点 t ,求最少删去几个点后,s 和 t 不连通。

  注意,s 和 t 不能删掉。1<=n<=100,1<=m<=600;


 二、解题思路:

  刚刚学了最大费用流,知道最大流等于最小割。但此题割的不是边,是点。

  我们需要将将割点转化为割边。把一个点切成两半!

  为之奈何?把一个点看成两个点,不就可以切成两半了吗?

  将每个点 i 与 i+n 连边,做到不重不漏。然后跑 EK 。

  怎么证明割 i 与 i+n 之间的边时,方案一定最优呢?

  感性理解:如果割的是其他的边,那么不会比割一个这条边连接的顶点划算;

  所以割顶点一定是最划算的,也就是割 i 与 i+n 之间的边是最优的。

  还有一个问题,网络流中是有边权的,这个题我们怎么设置边权呢?

  假设割掉 x 条边,那么答案应该是 x,x = x*1 。

  所以正向边权设为 1 就好了,反向边权设为 0 。

  EK 的时间复杂度为 O(NW) ,这个题最多割 n 条边,时间复杂度最坏 O(N^2) ,绰绰有余。

  其他没什么了,注意 dfs 起点设置为 s+n ,否则答案永远都是 1 !


 三、完整代码:

 1 #include<iostream>
 2 #define N 220
 3 #define M 610
 4 using namespace std;
 5 int n,m,s,t,u1,v1,ans,vis[N];
 6 struct EDGE{
 7     int v,w,nxt;
 8 }edge[M*4+N*2];
 9 int head[N],cnt;
10 void add(int u,int v,int w)
11 {
12     edge[cnt].v=v;
13     edge[cnt].w=w;
14     edge[cnt].nxt=head[u];
15     head[u]=cnt;cnt++;
16 }
17 int dfs(int u)
18 {
19     if(u==t)    return 1;
20     if(vis[u])    return 0;    vis[u]=1;
21     for(int i=head[u];i!=-1;i=edge[i].nxt)
22         if(edge[i].w&&dfs(edge[i].v))
23         {
24             edge[i].w--;
25             edge[i^1].w++;
26             return 1;
27         }
28     return 0;
29 }
30 int EK()
31 {
32     for(int i=1;i<=n*2;i++)
33         vis[i]=0;
34     return dfs(s+n);
35 }
36 int main()
37 {
38     cin>>n>>m>>s>>t;
39     for(int i=1;i<=n*2;i++)
40         head[i]=-1;
41     for(int i=1;i<=n;i++)
42         add(i,i+n,1),add(i+n,i,0);
43     for(int i=1;i<=m;i++)
44     {
45         cin>>u1>>v1;
46         add(u1+n,v1,1),add(v1,u1+n,0);
47         add(v1+n,u1,1),add(u1,v1+n,0);
48     }
49     while(EK())    ans++;
50     cout<<ans<<'\n';
51     return 0;
52 }

 四、写题心得:

  这个题有两个难点 ( 如果用我的方法做 ) ,一是拆点,二是设置边权。不过想出来了,就很高兴。加油!拜拜!

标签:cnt,int,题解,u1,v1,add,edge,Telecowmunication,P1345
From: https://www.cnblogs.com/yhy-trh/p/17360277.html

相关文章

  • 【题解】P3185 [HNOI2007]分裂游戏
    P3185[HNOI2007]分裂游戏题目描述聪聪和睿睿最近迷上了一款叫做分裂的游戏。该游戏的规则是:共有\(n\)个瓶子,标号为\(0,1,\ldots,n-1\),第\(i\)个瓶子中装有\(p_i\)颗巧克力豆,两个人轮流取豆子,每一轮每人选择\(3\)个瓶子,标号为\(i,j,k\),并要保证\(i\ltj,j......
  • 【题解】P4363 [九省联考 2018] 一双木棋 chess
    原题链接题目描述菲菲和牛牛在一块\(n\)行\(m\)列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手。棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束。落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且这个格子的左侧及上方的所有格子内都有棋......
  • BUAACTF2023 Writeup题解 by Joooook
    BUAACTF2023WriteupbyJoooook目录MiscWhichElementchatgptzhuzhuzhuzhu'srevengeScreenshotcarzymazeMCCryptoBlockCipherMathKeyExchangeWebmotaReverseoneQuiz'srevenge*SnakeMinesweepobfu可以从队名猜一下博主是哪里人(nooffline......
  • 【题解】XX Open Cup, GP of Moscow
    //createdon23.03.26目录A.AliceandBobB.BracketsC.CirclesD.DejaVuE.EasiestSumF.FunnySalesmanG.GraphColoringH.HiddenGraphI.InsectsJ.JoiningPointsA.AliceandBob对于链上的情况,异色点是一定不会选择走进同色段的(长度不小于\(2\)),因为一定不优。......
  • springboot入门时,发现Java版本与Spring boot版本无法对应导致错误的问题解决
    <?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/......
  • Hackpack 2023 逆向Re部分题解
    Hackpack2023-2023/4/15https://ctf2023.hackpack.club/challenges做了2题出来,其实是一题,第一题是手动逆向,第二题是脚本自动逆向主要是学习到了nclib包使用使用说明https://nclib.readthedocs.io/en/latest/netcat.htmlSpeed-Rev题目是在3分钟逆向6题第一题是直接找字符......
  • leetcode-350-两个数组的交集 II 题解
    题目给定两个数组,编写一个函数来计算它们的交集。示例1:输入:nums1=[1,2,2,1],nums2=[2,2]输出:[2,2]示例2:输入:nums1=[4,9,5],nums2=[9,4,9,8,4]输出:[4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。我们可以不考虑输出结果......
  • 2022CCPC威海站 铜牌题解 A C D E G I J 补题
    A//木桶效应#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=2e5+10;map<string,int>cham;pair<string,int>player[N];intcnt1[6];intcnt2[6];intn,m;intsum;signedmain(){cin>>n;f......
  • JOISC2016 题解
    仍然是没有做通信题。JOISC2016Day1Matryoshka俄罗斯套娃转化错了,转化成上升子序列了,然后就变成了区间LIS。实际上是LDS,那么就可以直接做了。https://qoj.ac/submission/99648JOISC2016Day1Memory2神经衰弱我们对数进行两两配对,然后把每一对都问出来。如果不存在相......
  • GLIBCXX_3.4.20 not found 问题解决【Unable to load shared library 'lib**.so'】
    前因:问题:在调用别人的so时,出现了如下问题【GLIBCXX_3.4.20notfound】Unabletoloadsharedlibrary'libdbc.so'oroneofitsdependencies.Inordertohelpdiagnoseloadingproblems,considersettingtheLD_DEBUGenvironmentvariable:/lib64/libstdc++.so.6:v......