FJWC2019 最短路
题目描述
有一张无向图,开始的时候所有边权为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
- #include <bits/stdc++.h>
- using namespace std;
- int T,K,N,M;
- const int fish1=101*101*4;
- const int fish2=8*101*101*101;
- vector<int> vec[fish1];
- int cnt,nex[fish2],las[fish2],Arrive[fish2],Flow[fish2];
- int d[fish1];
- void jt(int u,int v,int FF)
- {
- cnt++;
- nex[cnt]=las[u];
- las[u]=cnt;
- Arrive[cnt]=v;
- Flow[cnt]=FF;
- cnt++;
- nex[cnt]=las[v];
- las[v]=cnt;
- Arrive[cnt]=u;
- Flow[cnt]=0;
- }
- bool BFS()
- {
- memset(d,0,sizeof(d));
- d[2]=1;
- queue<int> qwq;
- qwq.push(2);
- while (!qwq.empty())
- {
- int R=qwq.front();
- qwq.pop();
- for (int i=las[R];i;i=nex[i])
- {
- if (Flow[i])
- {
- int RR=Arrive[i];
- if (!d[RR])
- {
- d[RR]=d[R]+1;
- qwq.push(RR);
- }
- }
- }
- }
- return d[T]>0;
- }
- int DFS(int Now,int flow)
- {
- if (!flow) return flow;
- if (Now==T) return flow;
- int ans=0;
- bool b=0;
- for (int i=las[Now];i;i=nex[i])
- {
- if (Flow[i])
- {
- int v=Arrive[i];
- if (d[v]!=d[Now]+1) continue;
- int tmp=DFS(v,min(Flow[i],flow));
- if (tmp)
- {
- flow-=tmp;
- ans+=tmp;
- Flow[i]-=tmp;
- Flow[i^1]+=tmp;
- b=1;
- if (!flow) break;
- }
- }
- }
- if(!b) d[Now]=-1;
- return ans;
- }
- int Dinic()
- {
- int ans=0;
- while (BFS())
- {
- ans+=DFS(2,1e6);
- if (ans>K) return ans;
- }
- return ans;
- }
- bool Check(int Now)
- {
- cnt=1;
- memset(las,0,sizeof(las));
- for (int i=1;i<=Now;i++)
- {
- for (int j=N-1;j>1;j--)
- 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);
- for (int j=1;j<=N;j++)
- for (int k=vec[j].size()-1;k>=0;k--)
- jt((i-1)*2*N+j*2,i*2*N+(vec[j][k]*2)-1,1e6);
- jt((i-1)*2*N+N*2-1,i*2*N+(N*2)-1,1e6);
- }
- T=(Now+1)*2*N-1;
- return Dinic()<=K;
- }
- int main()
- {
- freopen("min.in","r",stdin);
- freopen("min.out","w",stdout);
- scanf("%d%d%d",&N,&M,&K);
- for (int i=1;i<=M;i++)
- {
- int u,v;
- scanf("%d%d",&u,&v);
- u++;
- v++;
- vec[u].push_back(v);
- vec[v].push_back(u);
- }
- int l=1,r=2*N,anss;
- while (l<=r)
- {
- int mid=(l+r)/2;
- if (Check(mid)) anss=mid,l=mid+1;
- else r=mid-1;
- }
- printf("%d",anss+1);
- return 0;
- }
FJWC2019 最短路的更多相关文章
- bzoj1001--最大流转最短路
http://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路:这应该算是经典的最大流求最小割吧.不过题目中n,m<=1000,用最大流会TLE, ...
- 【USACO 3.2】Sweet Butter(最短路)
题意 一个联通图里给定若干个点,求他们到某点距离之和的最小值. 题解 枚举到的某点,然后优先队列优化的dijkstra求最短路,把给定的点到其的最短路加起来,更新最小值.复杂度是\(O(NElogE) ...
- Sicily 1031: Campus (最短路)
这是一道典型的最短路问题,直接用Dijkstra算法便可求解,主要是需要考虑输入的点是不是在已给出的地图中,具体看代码 #include<bits/stdc++.h> #define MA ...
- 最短路(Floyd)
关于最短的先记下了 Floyd算法: 1.比较精简准确的关于Floyd思想的表达:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设maz ...
- bzoj1266最短路+最小割
本来写了spfa wa了 看到网上有人写Floyd过了 表示不开心 ̄へ ̄ 改成Floyd试试... 还是wa ヾ(。`Д´。)原来是建图错了(样例怎么过的) 结果T了 于是把Floyd改回spfa 还 ...
- HDU2433 BFS最短路
Travel Time Limit: 10000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 最短路(代码来源于kuangbin和百度)
最短路 最短路有多种算法,常见的有一下几种:Dijstra.Floyd.Bellman-Ford,其中Dijstra和Bellman-Ford还有优化:Dijstra可以用优先队列(或者堆)优化,Be ...
- Javascript优化细节:短路表达式
什么是短路表达式? 短路表达式:作为"&&"和"||"操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程 ...
- Python中三目计算符的正确用法及短路逻辑
今天在看别人代码时看到这样一种写法, 感觉是个挺容易踩到的坑, 搞清楚后写出来备忘. 短路逻辑 Python中进行逻辑运算的时候, 默认采用的是一种叫做短路逻辑的运算规则. 名字是很形象的, 下面直接 ...
随机推荐
- 我所理解的 PHP Trait
Trait 是从 PHP 5.4 加入的一种细粒度代码复用的语法.以下是官方手册对 Trait 的描述: Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.Trait 为了减少单继承 ...
- idea如何设置注释作者信息
什么情况下使用? 在建一个新的类的时候 有注释信息 如下图所示 实现步骤 1 打开idea后 点击File后 选择Settings..如下图 2 打开后打开 file and code t ...
- alter table导致的mysql事务回滚失败
今天做数据迁移, 发现事务有时候可以回滚, 有时候不可以回滚, 最后一点点调试发现中间有段修改表结构的语句, 最终导致回滚失败. 1.MySQL最常用的两个表类型: InnoDB和MyISAM.MyI ...
- 查找mysql的my.cnf位置
1. which mysqld /user/local/mysql/bin/mysqld --verbose --help |grep -A 1 'Default options'
- Qracle 11g 插图安装
1.下载两个包 然后把包二的内容放入包一里 2.管理员身份运行setup 3.选择去掉复选框 4.下一步,然后选择是 5.选择第一项,然后选择下一步 6.个人使用选桌面类 7.不要放在C盘中 8.设置 ...
- java中的四种代码块
一.普通代码块 直接在一个方法中出现的{}就称为普通代码块,例子程序如下: public class CodeDemo01{ public static void main(String[] args ...
- XML--修改XML数据
DECLARE @xmlDoc XMLset @xmlDoc='<root> <book id="0001"> <title>C# Progra ...
- Python 实现图片对比检测
在写测试框架的时候,需要用到图片对比的方法来判断用例执行的情况,问了一下度娘,原来可以用PIL模块处理: from PIL import Image # 先安装Pillow, \>pip in ...
- leetcode 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: - 左括号必须用相同类型的右括号闭合. - 左括号必须以正确的顺序闭合. 注意空字符 ...
- 关于EF的一点小记录
今日新闻:朝鲜要改革开放了!!!比你牛逼的人都在努力,你还有理由懒惰吗? 宇宙强大IDE配套的EF问题记录 今天做数据添加时,Id我设置为int类型了,结果在做Add操作时报的错让我摸不着头脑,后来问 ...