题意

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题】的更多相关文章

  1. 【bzoj1266】[AHOI2006]上学路线route 最短路+最小割

    题目描述 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:“很可能我们在 ...

  2. BZOJ1266 AHOI2006上学路线(最短路+最小割)

    求出最短路后找出可能在最短路上的边,显然割完边后我们需要让图中这样的边无法构成1到n的路径,最小割即可,非常板子. #include<iostream> #include<cstdi ...

  3. HDU 5889 Barricade(最短路+最小割)

    http://acm.hdu.edu.cn/showproblem.php?pid=5889 题意: 给出一个图,帝国将军位于1处,敌军位于n处,敌军会选择最短路到达1点.现在帝国将军要在路径上放置障 ...

  4. BZOJ 1266 上学路线(最短路+最小割)

    给出n个点的无向图,每条边有两个属性,边权和代价. 第一问求1-n的最短路.第二问求用最小的代价删边使得最短路的距离变大. 对于第二问.显然该删除的是出现在最短路径上的边.如果我们将图用最短路跑一遍预 ...

  5. 2019HDU多校Path——最短路最小割

    题目 给出一个 $n$ 个顶点 $m$ 条边的图,要求阻塞一些边,使得从 $1$ 到 $n$ 的最短路变长,求阻塞的边长度和的最小值,不必保证阻塞后可达. 分析 很显然,要阻塞的边肯定在最短路图上,先 ...

  6. hdu 6852Path6(最短路+最小割)

    传送门 •题意 有n个城市,标号1-n 现花费最小的代价堵路 使得从1号城市到n号城市的路径边长 (注意只是变长不是最长) 堵一条路的代价是这条路的权值 •思路 在堵路以前,从1到n的最小路径当然是最 ...

  7. HDU 5889 Barricade(最短路+最小割水题)

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  8. BZOJ1266:上学路线route (最短路+最小割)

    可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:“很可能我们在上学的路途 ...

  9. 2019 Multi-University Training Contest 1 E Path(最短路+最小割)

    题意 链接:https://vjudge.net/problem/HDU-6582 给定一个有向图,可以有重边,每条边上有一个权值表示删掉这条边的代价,问最少花费多少代价能使从s到t节点的最短路径增大 ...

随机推荐

  1. C++中malloc/free和new/delete 的使用

    malloc/free 的使用要点 函数malloc的原型如下: void * malloc(size_t size); 用malloc申请一块长度为length的整数类型的内存,程序如下: int ...

  2. hadoop备战:一台x86计算机搭建hadoop的全分布式集群

    主要的软硬件配置: x86台式机,window7  64位系统 vb虚拟机(x86的台式机至少是4G内存,才干开3台虚机) centos6.4操作系统 hadoop-1.1.2.tar.gz jdk- ...

  3. WEB服务器2--IIS架构(转)

    开始之前可以先读:http://www.cnblogs.com/tiantianle/p/5419445.html 原文:http://www.cnblogs.com/arbin98/archive/ ...

  4. 自由缩放属性-resize(禁止textarea的自由缩放尺寸功能)

    resize:none|both|horizontal|vertical|inherit 可以用来改变元素的尺寸大小 用上这个属性后元素的有下脚会有一个小图标 拖它就可以了 但是我把resize:bo ...

  5. java——拷贝文件夹方法

    public void copyFolder(String oldPath, String newPath) { try { (new File(newPath)).mkdirs(); //如果文件夹 ...

  6. [MSDN] GROUP BY (Transact-SQL)

    来源: https://msdn.microsoft.com/zh-cn/library/ms177673(v=sql.110).aspx 按 SQL Server 中一个或多个列或表达式的值将一组选 ...

  7. VS 2003 无法打开Web项目,位于服务器“http:10.45.4.70:8080”上的项目不存在

    解决方法: 用记事本打开*.sln文件更改第2行 改成正确的虚拟目录 出现这种情况往往是从一台机器搬到另一台机器造成的虚拟路径名字不同

  8. canvas写的一个小时钟demo

    <!DOCTYPE html> <html> <head> <title>HTML5 Canvas Demo of clock</title> ...

  9. Python学习笔记3(数据结构)

    1.元组结构(Tuple) 元组由不同的元素组成,每个元素可以存储不同类型的数据,如字符串.数字甚至元组.元组创建后不能修改. 元组通常代表一行数据,而元组中的元素代表不同的数据项. 1.1元组的创建 ...

  10. Cortex-M3知识点

    1.不再像别的ARM7那样从thumb状态和ARM状态来回切换 Thumb-2指令集横空出世,Cortex-M3不支持ARM指令集 2.BKP备份寄存器(42个16位寄存器组成),用来存储用户应用程序 ...