题意:给你n个墓室,m条路径,一个人在1号墓室(起点),另一个人在n号墓室(终点),起点的那个人只有通过最短路径才能追上终点的那个人,而终点的那个人能切断任意路径。

第一问——终点那人要使起点那人不能追上的情况下可以切的最少的路径数,输出最少的路径数

第二问——起点那人能追上终点那人的情况下,终点那人能切断的最多的路径数,输出最多的路径数

我们先用dijstra计算出最短距离 然后通过最短距离建边 建成每条边容量为1 的 网络流 然后再求这个图的最大流  最大流等于最小割  因为我们知道了 最短路是个GAD 然后我们直接再找一次便可

#include <iostream>
#include <algorithm>
#include <string.h>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int INF=;
const int maxn=+; struct Dinic{
struct Edge{
int from,to,cap,flow;
Edge(int cfrom, int cto , int ccap, int cflow)
{
from=cfrom; to=cto; cap=ccap;flow=cflow;
}
};
int n,m,s,t;
vector<Edge>edges;
vector<int>G[maxn];
int d[maxn];
int cur[maxn];
void init(int n)
{
this->n=n;
edges.clear();
for(int i=; i<=n; i++)G[i].clear();
}
void AddEdge(int from,int to, int cap)
{
edges.push_back(Edge(from,to,cap,));
edges.push_back(Edge(to,from,,));
m=edges.size();
G[from].push_back(m-);
G[to].push_back(m-);
}
bool BFS()
{
memset(d,-,sizeof(d));
queue<int>Q;
Q.push(s);
d[s]=;
while(!Q.empty())
{
int x =Q.front(); Q.pop();
for(int i=; i<G[x].size(); i++)
{
Edge &e=edges[G[x][i]];
if((d[e.to]==-)&&e.cap>e.flow){
d[e.to]=d[x]+;
Q.push(e.to);
}
}
}
return d[t]!=-;
}
int DFS(int x, int a)
{
if(x==t || a<=)return a;
int flow=,f;
for(int &i=cur[x]; i<G[x].size(); i++)
{
Edge &e=edges[G[x][i]];
if(d[x]+==d[e.to]&&(f=DFS(e.to,min(a,e.cap-e.flow)))>)
{
e.flow+=f;
edges[G[x][i]^].flow-=f;
flow+=f;
a-=f;
if(a==)break;
}
}
return flow;
}
int Maxflow(int s, int t)
{
this->s=s; this->t=t;
int flow=;
while(BFS())
{
memset(cur,,sizeof(cur));
flow+=DFS(s,INF-);
}
return flow;
}
};
struct Dijskstr
{ struct Edge
{
int from,to,dist;
Edge(int cfrom, int cto, int cdist)
{
from=cfrom; to=cto; dist=cdist;
}
};
struct HeapNode
{
int d,u;
bool operator <(const HeapNode &rhs) const{
return d>rhs.d;
}
HeapNode(int cd ,int cu)
{
d=cd; u=cu;
}
};
int dis[maxn];
int n,m;
vector<Edge>edges;
vector<int>G[maxn];
bool done[maxn];
int d[maxn];
void init(int n)
{
this->n=n;
for(int i=; i<=n; i++)G[i].clear();
edges.clear();
}
void AddEdge(int from , int to, int dist)
{
edges.push_back(Edge(from,to,dist));
m=edges.size();
G[from].push_back(m-);
}
void dijkstra(int s)
{
priority_queue<HeapNode>Q;
for(int i=; i<=n; i++)d[i]=INF;
d[s]=;
memset(done,,sizeof(done));
Q.push(HeapNode(,s));
while(!Q.empty())
{
HeapNode x=Q.top(); Q.pop();
int u=x.u;
if(done[u]) continue;
done[u]=true;
for(int i=; i<G[u].size(); i++)
{
Edge &e=edges[G[u][i]];
if(d[e.to]>d[u]+e.dist)
{
d[e.to]=d[u]+e.dist;
Q.push(HeapNode(d[e.to],e.to));
}
}
}
}
Dinic dic;
int solve()
{
for(int i=; i<=n; i++)dis[i]=INF;
queue<int>Q;
Q.push();
dis[]=;
dic.init(n);
while(!Q.empty())
{
int x= Q.front();Q.pop();
int siz=G[x].size();
for(int i=; i<siz; i++)
{
Edge &e=edges[G[x][i]];
if(d[e.to]==d[x]+e.dist){
dic.AddEdge(x,e.to,);
dis[e.to]=min(dis[e.to],dis[x]+);
Q.push(e.to);
}
}
}
return dic.Maxflow(,n);
}
}dij;
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==)
{
if(n==){
while(true);
}
dij.init(n);
for(int i=; i<m; i++)
{
int a,b,li;
scanf("%d%d%d",&a,&b,&li);
dij.AddEdge(a,b,li);
dij.AddEdge(b,a,li); }
dij.dijkstra();
if(dij.d[n]==INF){
while(true);
}
int d2=dij.solve();
printf("%d %d\n",d2,m-dij.dis[n]);
}
return ;
}

hdu5294 网络流+dijskstr的更多相关文章

  1. plain framework 1 网络流 缓存数据详解

    网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块.该部分为PF现有的网络流模型,但 ...

  2. 网络流模板 NetworkFlow

    身边的小伙伴们都在愉快地刷网络流,我也来写一发模板好了. Network Flow - Maximum Flow Time Limit : 1 sec, Memory Limit : 65536 KB ...

  3. COGS732. [网络流24题] 试题库

    «问题描述:假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法.«编程任务: ...

  4. ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)

    //有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...

  5. BZOJ 3144 [Hnoi2013]切糕 ——网络流

    [题目分析] 网络流好题! 从割的方面来考虑问题往往会得到简化. 当割掉i,j,k时,必定附近的要割在k-D到k+D上. 所以只需要建两条inf的边来强制,如果割不掉强制范围内的时候,原来的边一定会换 ...

  6. bzoj3572又TM是网络流

    = =我承认我写网络流写疯了 = =我承认前面几篇博文都是扯淡,我写的是垃圾dinic(根本不叫dinic) = =我承认这道题我调了半天 = =我承认我这道题一开始是T的,后来换上真正的dinic才 ...

  7. hdu3549还是网络流

    最后一次训练模板(比较熟练了) 接下来训练网络流的建图 #include <cstdio> #define INF 2147483647 int n,m,ans,x,y,z,M,h,t,T ...

  8. 二分图&网络流&最小割等问题的总结

    二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...

  9. COGS743. [网络流24题] 最长k可重区间集

    743. [网络流24题] 最长k可重区间集 ★★★   输入文件:interv.in   输出文件:interv.out   简单对比时间限制:1 s   内存限制:128 MB «问题描述: «编 ...

随机推荐

  1. mysql报错Establishing SSL connection without server's identity verification is not recommended

    使用mysql数据库时报错:Establishing SSL connection without server's identity verification is not recommended ...

  2. Selenium功能自动化测试工具

    Selenium也是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mozilla Firefox.Mozilla Suite ...

  3. ES6新特性三: Generator(生成器)函数详解

    本文实例讲述了ES6新特性三: Generator(生成器)函数.分享给大家供大家参考,具体如下: 1. 简介 ① 理解:可以把它理解成一个函数的内部状态的遍历器,每调用一次,函数的内部状态发生一次改 ...

  4. 洛谷P4587 神秘数 [FJOI2016] 主席树

    正解:主席树 解题报告: 先放下传送门QAQ 首先可以先思考如果只有一组询问,怎么解决 可以这么想,最开始一个数也麻油的时候能表示的最大的数是0嘛 然后先排个序,按顺序每次新加入一个数x,设加入这个数 ...

  5. P4827 [国家集训队] Crash 的文明世界

    传送门:洛谷 题目大意:设$$S(i)=\sum_{j=1}^ndis(i,j)^k$$,求$S(1),S(2),\ldots,S(n)$. 数据范围:$n\leq 50000,k\leq 150$ ...

  6. Linux下高并发socket最大连接数各种限制的调优

    1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每 ...

  7. 20170725 Python 必须使用的Url编码

    -- 1 原因:在进行API 调用传参时,如果出现了和区分参数标识一样的特殊字符,那么就需要编码来作用 或者,传递的参数有敏感数据. 我的目的: Python开发的接口,C#调用传递参数 先用C# 进 ...

  8. Python字符串切片

    1.字符串切片:从字符串中取出相应的元素,重新组成一个新的字符串 语法: 字符串[    开始元素下标  :  结束元素下标  :  步长     ]   # 字符串的每个元素都有正负两种下标 步长: ...

  9. js或jsp 获取项目路径常用方法

    可以引入一个jsp,这个jsp的内容如下: <%@page pageEncoding="UTF-8" contentType="text/javascript; c ...

  10. [sh]getopt参数解析

    https://www.cnblogs.com/FrankTan/archive/2010/03/01/1634516.html sh参数处理方法 * 手工处理方式 * getopts #好像不支持长 ...