【求出所有最短路+最小割】【多校第一场】【G题】
题意
A从1要追在N的 B 只能走最短的路
问B最少切断多少条路可以让A不能过来
问B最多切断多少条路A还是能过来
对于1 求出1到N的所有最短路的路径,对其求最小割
对于2 求出长度最小的最短路即可
如何求所有最短路呢 利用这个
void dfs(int s,int ans)
{ if(s==N)
{
ANS2=min(ans,ANS2);
return ;
}
for(EDGE *p=Graph[s].first;p;p=p->next)
{
if(dist[s]+p->w==dist[p->to])
{
if(VISIT[s]==0) { VISIT[s]=1;nn++;}
if(VISIT[p->to]==0) { VISIT[p->to]=1;nn++;}
addedge(s,p->to,1,0);
dfs(p->to,ans+1);
}
}
}
即这个判断来判断所有路径
if(dist[s]+p->w==dist[p->to])
代码如下
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#define oo 0x13131313
using namespace std;
const int maxn=5000;
int visit[maxn];
int dist[maxn];
int VISIT[maxn];
int N,m;
struct EDGE{
int w;
int to;
EDGE *next;
}E[300000],*EE;
struct node{
EDGE *first;
}Graph[maxn];
//网络流
const int MAXN=4000+5;
const int MAXM=300000;
const int INF=0x3f3f3f3f;
int nn=0;
int ANS2=0x3f3f3f3f;
struct Edge
{
int to,next,cap,flow;
void get(int a,int b,int c,int d)
{
to=a;next=b;cap=c;flow=d;
}
}edge[MAXM];
int tol;
int head[MAXN];
int gap[MAXN],dep[MAXN],pre[MAXN],cur[MAXN];
void init()
{
tol=0;
memset(head,-1,sizeof(head));
}
//单向图三个参数,无向图四个参数
void addedge(int u,int v,int w,int rw=0)
{
edge[tol].get(v,head[u],w,0);head[u]=tol++;
edge[tol].get(u,head[v],rw,0);head[v]=tol++;
}
int sap(int start,int end,int N)
{
memset(gap,0,sizeof(gap));
memset(dep,0,sizeof(dep));
memcpy(cur,head,sizeof(head));
int u=start;
pre[u]=-1;
gap[0]=N;
int ans=0;
while(dep[start]<N)
{
if(u==end)
{
int Min=INF;
for(int i=pre[u];i!=-1;i=pre[edge[i^1].to])
if(Min>edge[i].cap-edge[i].flow)
Min=edge[i].cap-edge[i].flow;
for(int i=pre[u];i!=-1;i=pre[edge[i^1].to])
{
edge[i].flow+=Min;
edge[i^1].flow-=Min;
}
u = start;
ans+=Min;
continue;
}
bool flag=false;
int v;
for(int i=cur[u];i !=-1;i=edge[i].next)
{
v=edge[i].to;
if(edge[i].cap-edge[i].flow&&dep[v]+1==dep[u])
{
flag=true;
cur[u]=pre[v]=i;
break;
}
}
if(flag)
{
u=v;
continue;
}
int Min=N;
for(int i=head[u];i!=-1;i=edge[i].next)
if(edge[i].cap-edge[i].flow&&dep[edge[i].to]<Min)
{
Min=dep[edge[i].to];
cur[u]=i;
}
gap[dep[u]]--;
if(!gap[dep[u]]) return ans;
dep[u]=Min+1;
gap[dep[u]]++;
if(u!=start) u=edge[pre[u]^1].to;
}
return ans;
}
void Link(int u,int v,int w)
{
EE->next=Graph[u].first;EE->to=v;EE->w=w;Graph[u].first=EE++;
}
void input()
{
ANS2=m;
memset(E,0,sizeof(E));
memset(Graph,0,sizeof(Graph));
EE=E+1;
int a,b,c;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
Link(a,b,c);
Link(b,a,c);
}
}
void finddist(int &s)
{
int ans=2000000000;
for(int i=1;i<=N;i++)
if(visit[i]==0)
{
if(dist[i]<ans)
{
ans=dist[i];
s=i;
}
}
visit[s]=1;
}
void Dijkstra(int s)
{
dist[s]=0;
for(int k=1;k<=N-1;k++)
{
finddist(s);
for(EDGE *p=Graph[s].first;p;p=p->next)
if(dist[s]+p->w<dist[p->to]) dist[p->to]=dist[s]+p->w;
}
}
void CSH()
{
memset(visit,0,sizeof(visit));
for(int i=0;i<maxn;i++)
dist[i]=1000000000;
}
void dfs(int s,int ans)
{ if(s==N)
{
ANS2=min(ans,ANS2);
return ;
}
for(EDGE *p=Graph[s].first;p;p=p->next)
{
if(dist[s]+p->w==dist[p->to])
{
if(VISIT[s]==0) { VISIT[s]=1;nn++;}
if(VISIT[p->to]==0) { VISIT[p->to]=1;nn++;}
addedge(s,p->to,1,0);
dfs(p->to,ans+1);
}
}
}
void solve()
{
nn=0;
memset(VISIT,0,sizeof(VISIT));
CSH();
Dijkstra(1);
init();
dfs(1,0);
printf("%d %d\n",sap(1,N,nn),m-ANS2);
}
int main()
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
while(cin>>N>>m)
{
input();
solve();
}
}
【求出所有最短路+最小割】【多校第一场】【G题】的更多相关文章
- 【bzoj1266】[AHOI2006]上学路线route 最短路+最小割
题目描述 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:“很可能我们在 ...
- BZOJ1266 AHOI2006上学路线(最短路+最小割)
求出最短路后找出可能在最短路上的边,显然割完边后我们需要让图中这样的边无法构成1到n的路径,最小割即可,非常板子. #include<iostream> #include<cstdi ...
- HDU 5889 Barricade(最短路+最小割)
http://acm.hdu.edu.cn/showproblem.php?pid=5889 题意: 给出一个图,帝国将军位于1处,敌军位于n处,敌军会选择最短路到达1点.现在帝国将军要在路径上放置障 ...
- BZOJ 1266 上学路线(最短路+最小割)
给出n个点的无向图,每条边有两个属性,边权和代价. 第一问求1-n的最短路.第二问求用最小的代价删边使得最短路的距离变大. 对于第二问.显然该删除的是出现在最短路径上的边.如果我们将图用最短路跑一遍预 ...
- 2019HDU多校Path——最短路最小割
题目 给出一个 $n$ 个顶点 $m$ 条边的图,要求阻塞一些边,使得从 $1$ 到 $n$ 的最短路变长,求阻塞的边长度和的最小值,不必保证阻塞后可达. 分析 很显然,要阻塞的边肯定在最短路图上,先 ...
- hdu 6852Path6(最短路+最小割)
传送门 •题意 有n个城市,标号1-n 现花费最小的代价堵路 使得从1号城市到n号城市的路径边长 (注意只是变长不是最长) 堵一条路的代价是这条路的权值 •思路 在堵路以前,从1到n的最小路径当然是最 ...
- HDU 5889 Barricade(最短路+最小割水题)
Barricade Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- BZOJ1266:上学路线route (最短路+最小割)
可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:“很可能我们在上学的路途 ...
- 2019 Multi-University Training Contest 1 E Path(最短路+最小割)
题意 链接:https://vjudge.net/problem/HDU-6582 给定一个有向图,可以有重边,每条边上有一个权值表示删掉这条边的代价,问最少花费多少代价能使从s到t节点的最短路径增大 ...
随机推荐
- [HeadFist-HTMLCSS学习笔记][第七章CSS入门:加一点样式]
CSS入门 style元素设置CSS 基本格式 <style type="text/css"> body { background-color: #eaf3da; } ...
- HTML5-常见的事件- DOMContentLoaded事件
一般我们监听文档是否加载完成是使用 window的load事件,该事件会在页面中的一切加载完毕时触发,但这个过程可能会因为要加载的外部资源过多而等待时间过长. DOMContentLoaded事件:则 ...
- Javascript - IE8下parseInt()方法的取值异常
公司的测试小妹妹跑来对我说,下拉框第9项始终无法正确提交的时候,我还以为见鬼了. parseInt()会把'0'开头的数字以8进制来解析,当有大于7的数字时候就按10进制来解析. // p ...
- 我的第一个MVC项目
这是本人第一个完全按照MVC开发模式完成的项目,非常简陋,仅仅完成的查询,保存,删除基本功能,而且存在编码问题没有解决,以后会慢慢增加功能.慢慢改进 package com.sdjt.dao; imp ...
- enumerateObjectsUsingBlock VS for(... in ...)
enumerateObjectsUsingBlock VS for(... in ...) for(... in ...)用起来非常方便.简洁,同时enumerateObjectsUsingBlock ...
- 通过AJAX和PHP,提交JQuery Mobile表单
File name: callajax.php <?php $firstName = $_POST[firstName]; $lastName = $_POST[lastName]; echo( ...
- Java IO6 :IO总结
字节流.字符流继承关系 前几篇文章讲解了字节流.字符流的使用,不过Java提供给用户的流类远不止此,限于篇幅原因,没办法一一讲解,而且也没有必要一一讲解,就像我在写博客的时候多次提到的,有问题的时候学 ...
- BZOJ 2882 工艺 (字符串最小循环同构)
题目大意: 给一个长度小于等于30W的数列,求其最小循环同构. 算法讨论: 在自动机长倍长走S后即可.注意这里面是数字,要用map存储. 今天才知道要开四倍长. Codes: #include < ...
- JS多选日期
项目需要一个可以选择多个日期的日期选择框,从网上找到一个单选的选择框源码 (http://blog.5d.cn/user2/samuel/200503/61881.html),修改成可以多选. 使用方 ...
- Lucene学习总结之二:Lucene的总体架构
Lucene总的来说是: 一个高效的,可扩展的,全文检索库. 全部用Java实现,无须配置. 仅支持纯文本文件的索引(Indexing)和搜索(Search). 不负责由其他格式的文件抽取纯文本文件, ...