题目描述

有一张无向图,开始的时候所有边权为1,所有点没有权值,现在给定一个整数k,表示可以将k个点的点权设置为1,求点0到n-1的最短路最长是多少

Solution

网络流好题[然而本蒟蒻还是不会][这个建图是真的神仙…]

最短路最长,最大化最小的问题,考虑二分,我们先二分出一个mid,表示假设最短路最长是mid

然后建图建mid+1层,将每个点拆成两个点si和ti,从si向ti连一条流量为1的边,表示割掉这条边需要1的代价[割掉了就是+1s]

为了保证每个点只被选择一次,从这层的si向下一层的ti连一条流量为正无穷的边。然后对于本来图中存在的边<x,y>,从这层的tx向下一层的sy连一条流量为无穷的边

从这层的sn-1向下一层的sn-1连流量为无穷的边

如果从第一层的t0到mid+1层的sn-1的最小割<=k 向[mid+1,r]找,否则向[l,mid-1]找

[本蒟蒻理解这个建图理解了一个晚上x]

[效果大概长这样?][我画的图还是好丑啊]

然后建完图跑网络流就可以啦!

总效率O(能过)

Code

  1. #include <bits/stdc++.h>  
  2. using namespace std;  
  3. int T,K,N,M;  
  4. const int fish1=101*101*4;  
  5. const int fish2=8*101*101*101;  
  6. vector<int> vec[fish1];  
  7. int cnt,nex[fish2],las[fish2],Arrive[fish2],Flow[fish2];  
  8. int d[fish1];  
  9. void jt(int u,int v,int FF)  
  10. {  
  11.     cnt++;  
  12.     nex[cnt]=las[u];  
  13.     las[u]=cnt;  
  14.     Arrive[cnt]=v;  
  15.     Flow[cnt]=FF;  
  16.     cnt++;  
  17.     nex[cnt]=las[v];  
  18.     las[v]=cnt;  
  19.     Arrive[cnt]=u;  
  20.     Flow[cnt]=0;  
  21. }  
  22. bool BFS()  
  23. {  
  24.     memset(d,0,sizeof(d));  
  25.     d[2]=1;  
  26.     queue<int> qwq;  
  27.     qwq.push(2);  
  28.     while (!qwq.empty())  
  29.     {  
  30.         int R=qwq.front();  
  31.         qwq.pop();  
  32.         for (int i=las[R];i;i=nex[i])  
  33.           {  
  34.             if (Flow[i])  
  35.              {  
  36.                 int RR=Arrive[i];  
  37.                 if (!d[RR])  
  38.                    {  
  39.                    d[RR]=d[R]+1;  
  40.                    qwq.push(RR);  
  41.                   }  
  42.              }  
  43.           }  
  44.     }  
  45.     return d[T]>0;  
  46. }  
  47. int DFS(int Now,int flow)  
  48. {  
  49.     if (!flow) return flow;  
  50.     if (Now==T) return flow;  
  51.     int ans=0;  
  52.     bool b=0;  
  53.     for (int i=las[Now];i;i=nex[i])  
  54.       {  
  55.         if (Flow[i])  
  56.           {  
  57.             int v=Arrive[i];  
  58.             if (d[v]!=d[Now]+1) continue;  
  59.             int tmp=DFS(v,min(Flow[i],flow));  
  60.             if (tmp)  
  61.             {  
  62.                 flow-=tmp;  
  63.                 ans+=tmp;  
  64.                 Flow[i]-=tmp;  
  65.                 Flow[i^1]+=tmp;  
  66.                 b=1;  
  67.                 if (!flow) break;  
  68.             }  
  69.           }  
  70.       }  
  71.       if(!b) d[Now]=-1;  
  72.     return ans;  
  73. }  
  74. int Dinic()  
  75. {  
  76.     int ans=0;  
  77.     while (BFS())  
  78.     {  
  79.         ans+=DFS(2,1e6);  
  80.         if (ans>K) return ans;  
  81.     }  
  82.     return ans;  
  83. }  
  84. bool Check(int Now)  
  85. {  
  86.     cnt=1;  
  87.     memset(las,0,sizeof(las));  
  88.     for (int i=1;i<=Now;i++)  
  89.       {  
  90.         for (int j=N-1;j>1;j--)  
  91.           jt((i-1)*2*N+j*2-1,(i-1)*2*N+j*2,1),jt((i-1)*2*N+j*2-1,i*2*N+j*2,1e6);  
  92.           for (int j=1;j<=N;j++)  
  93.             for (int k=vec[j].size()-1;k>=0;k--)  
  94.                 jt((i-1)*2*N+j*2,i*2*N+(vec[j][k]*2)-1,1e6);  
  95.             jt((i-1)*2*N+N*2-1,i*2*N+(N*2)-1,1e6);  
  96.       }  
  97.     T=(Now+1)*2*N-1;  
  98.     return Dinic()<=K;  
  99. }  
  100. int main()  
  101. {  
  102.     freopen("min.in","r",stdin);  
  103.     freopen("min.out","w",stdout);  
  104.     scanf("%d%d%d",&N,&M,&K);  
  105.     for (int i=1;i<=M;i++)  
  106.       {  
  107.         int u,v;  
  108.         scanf("%d%d",&u,&v);  
  109.         u++;  
  110.         v++;  
  111.         vec[u].push_back(v);  
  112.         vec[v].push_back(u);  
  113.       }  
  114.       int l=1,r=2*N,anss;  
  115.       while (l<=r)  
  116.       {  
  117.         int mid=(l+r)/2;  
  118.         if (Check(mid)) anss=mid,l=mid+1;  
  119.         else r=mid-1;  
  120.       }  
  121.       printf("%d",anss+1);  
  122.     return 0;     
  123. }  

FJWC2019 最短路的更多相关文章

  1. bzoj1001--最大流转最短路

    http://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路:这应该算是经典的最大流求最小割吧.不过题目中n,m<=1000,用最大流会TLE, ...

  2. 【USACO 3.2】Sweet Butter(最短路)

    题意 一个联通图里给定若干个点,求他们到某点距离之和的最小值. 题解 枚举到的某点,然后优先队列优化的dijkstra求最短路,把给定的点到其的最短路加起来,更新最小值.复杂度是\(O(NElogE) ...

  3. Sicily 1031: Campus (最短路)

    这是一道典型的最短路问题,直接用Dijkstra算法便可求解,主要是需要考虑输入的点是不是在已给出的地图中,具体看代码 #include<bits/stdc++.h> #define MA ...

  4. 最短路(Floyd)

    关于最短的先记下了 Floyd算法: 1.比较精简准确的关于Floyd思想的表达:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设maz ...

  5. bzoj1266最短路+最小割

    本来写了spfa wa了 看到网上有人写Floyd过了 表示不开心 ̄へ ̄ 改成Floyd试试... 还是wa ヾ(。`Д´。)原来是建图错了(样例怎么过的) 结果T了 于是把Floyd改回spfa 还 ...

  6. HDU2433 BFS最短路

    Travel Time Limit: 10000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  7. 最短路(代码来源于kuangbin和百度)

    最短路 最短路有多种算法,常见的有一下几种:Dijstra.Floyd.Bellman-Ford,其中Dijstra和Bellman-Ford还有优化:Dijstra可以用优先队列(或者堆)优化,Be ...

  8. Javascript优化细节:短路表达式

    什么是短路表达式? 短路表达式:作为"&&"和"||"操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程 ...

  9. Python中三目计算符的正确用法及短路逻辑

    今天在看别人代码时看到这样一种写法, 感觉是个挺容易踩到的坑, 搞清楚后写出来备忘. 短路逻辑 Python中进行逻辑运算的时候, 默认采用的是一种叫做短路逻辑的运算规则. 名字是很形象的, 下面直接 ...

随机推荐

  1. [Selenium]刷新页面 Refresh page

    5 different ways to refresh a webpage using Selenium Webdriver   Here are the 5 different ways, usin ...

  2. Java 设计模式系列(三)抽象工厂

    Java 设计模式系列(三)抽象工厂 每天用心记录一点点.内容也许不重要,但习惯很重要!

  3. 在MS Test中如何测试private方法

    前言: 在博客开始之前,我们先讨论一下是否应该对private方法做测试,通常有两种观点: private方法应该被测试: private方法不应该被测试: 我们以下面的代码为例子来进行说明: pub ...

  4. PHP 微信公众号开发 - 获取用户信息

    项目微信公众号开发,记录获取用户微信号信息,和用户openid 1,登录微信公众平台 点击登录微信公众平台 2,获取公众号开发信息 登陆之后在 开发->基本配置 3,设置IP白名单 在这里添加服 ...

  5. 高性能mysql第三版(文摘)

    第1章 mysql架构与历史 1.1处理和存储相分离,用户可以选择合适的存储引擎 1.2并发控制 表锁:开销小 行级锁:开销大 1.3事务 acid特性:原子性,一致性,隔离性,持久性 1.4 多版本 ...

  6. Android 4.3实现类似iOS在音乐播放过程中如果有来电则音乐声音渐小铃声渐大的效果

    目前Android的实现是:有来电时,音乐声音直接停止,铃声直接直接使用设置的铃声音量进行铃声播放. Android 4.3实现类似iOS在音乐播放过程中如果有来电则音乐声音渐小铃声渐大的效果. 如果 ...

  7. HRBUST1200 装修 2017-03-06 15:41 94人阅读 评论(0) 收藏

    装修 hero为了能顺利娶princess ,花了血本,买了个房子,现在决定装修.房子的长度为n米,宽度为3米,现在我们有2种地砖,规格分别是1米×1米,2米×2米,如果要为该教室铺设地砖,请问有几种 ...

  8. Codeforces 768A Oath of the Night's Watch 2017-02-21 22:13 39人阅读 评论(0) 收藏

    A. Oath of the Night's Watch time limit per test 2 seconds memory limit per test 256 megabytes input ...

  9. css transition & animation

    transition 支持:IE10+ img{ transition: 1s 1s height ease; } transition-property: 属性transition-duration ...

  10. Eclipse中Tomcat的配置及简单例子

    Eclipse中Tomcat的配置及简单例子 Eclipse中Tomcat的配置是很简单的一个工作 一. 工具下载 Eclipse,最新版的eclipse为Mars版本.下载地址为: http://w ...