题意:给你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. 转:Spring AOP中的动态代理

    原文链接:Spring AOP中的动态代理 0  前言 1  动态代理 1.1 JDK动态代理 1.2 CGLIB动态代理 1.2.1 CGLIB的代理用法 1.2.2 CGLIB的过滤功能 2  S ...

  2. LeetCode 883 Projection Area of 3D Shapes 解题报告

    题目要求 On a N * N grid, we place some 1 * 1 * 1 cubes that are axis-aligned with the x, y, and z axes. ...

  3. MySQL 数据库登录查询

    1. 进入到bin目录:   键入cd..,一直到出现C:\ 为止   然后cd bin所在路径:   如: C:\cd C:\Program Files\MySQL\MySQL Server 5.7 ...

  4. 《Mysql 日志结构》

    推荐一首歌 - <往后余生>王贰浪 发现自己每天就听这么几首歌 一:慢查询日志 - SQL 完成查询并完成对于锁资源的释放之后,msqld 会将符合条件的SQL写入慢日志.因此慢日志可能和 ...

  5. spring+shiro+springmvc+maven权限卡控示例

    项目结构 UserController , 主要负责用户登入和注销. LinewellController, 主要负责请求受权限卡控的数据. MyRealm,自定义realm. Authorizati ...

  6. Windows7安装两个jdk配置

    win7 配置两个jdk,之前装了jdk1.6,项目需要安装1.8. 首先去oracle官网下载一个和你eclipse版本一致的jdk(我的是32位). 网址:https://www.oracle.c ...

  7. 机器Coding For WPF

    declare @modelcode varchar(90)='AutoProjectType'declare @ns varchar(90)='WpfApplication'declare @dat ...

  8. 让网站不去请求favicon.ico图标

    让网站不去请求favicon.ico图标 favicon.ico 图标用于收藏夹图标和浏览器标签上的显示,如果不设置,浏览器会请求网站根目录的这个图标,如果网站根目录也没有这图标会产生 404.出于优 ...

  9. 20181223 Oracle中while

    最近尝试了一次while跑数, declare sysdataend  date:=system-1; startdata  date:=to_date('20181214','YYYYMMDD'); ...

  10. what's the 跨期套利

    出自 MBA智库百科(https://wiki.mbalib.com/) 跨期套利的定义 跨期套利是套利交易中最普遍的一种,是股指期货的跨期套利(Calendar Spread Arbitrage)即 ...