hdu5294 网络流+dijskstr
题意:给你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的更多相关文章
- plain framework 1 网络流 缓存数据详解
网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块.该部分为PF现有的网络流模型,但 ...
- 网络流模板 NetworkFlow
身边的小伙伴们都在愉快地刷网络流,我也来写一发模板好了. Network Flow - Maximum Flow Time Limit : 1 sec, Memory Limit : 65536 KB ...
- COGS732. [网络流24题] 试题库
«问题描述:假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法.«编程任务: ...
- ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)
//有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...
- BZOJ 3144 [Hnoi2013]切糕 ——网络流
[题目分析] 网络流好题! 从割的方面来考虑问题往往会得到简化. 当割掉i,j,k时,必定附近的要割在k-D到k+D上. 所以只需要建两条inf的边来强制,如果割不掉强制范围内的时候,原来的边一定会换 ...
- bzoj3572又TM是网络流
= =我承认我写网络流写疯了 = =我承认前面几篇博文都是扯淡,我写的是垃圾dinic(根本不叫dinic) = =我承认这道题我调了半天 = =我承认我这道题一开始是T的,后来换上真正的dinic才 ...
- hdu3549还是网络流
最后一次训练模板(比较熟练了) 接下来训练网络流的建图 #include <cstdio> #define INF 2147483647 int n,m,ans,x,y,z,M,h,t,T ...
- 二分图&网络流&最小割等问题的总结
二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...
- COGS743. [网络流24题] 最长k可重区间集
743. [网络流24题] 最长k可重区间集 ★★★ 输入文件:interv.in 输出文件:interv.out 简单对比时间限制:1 s 内存限制:128 MB «问题描述: «编 ...
随机推荐
- jQuery 学习笔记(2)(jQuery静态方法)
jQuery静态方法 1.$.each() 和 $.map() 既可以遍历数组也可以遍历伪数组 $.each(arr, function(value, index) { ... } ) $.map( ...
- python实现图片隐藏信息技术
隐秘通信的3种典型方式: ①将秘密信息隐于网络通信协议中. ②将秘密信息隐于数字签名等密码协议中 . ③将秘密信息隐于数字图像中. 第三种是利用图像或音频数据对人类感官系统的冗余. 隐藏域数字图像中的 ...
- [资料] Ceph存储系统,关于Redhat和Suse企业版存储知识汇总
版权声明:很多其它内容,请关注[架构师技术联盟]公众号 https://blog.csdn.net/BtB5e6Nsu1g511Eg5XEg/article/details/81117091 wx_f ...
- json传参 js前端和java后端 的简单例子
下面讲解了从前端js对象-->json字符串-->java字符串---->java map的过程 1,初始化js对象 var param = {}; param.krel = kre ...
- MySQL深入理解
[存储引擎] InnoDB表引擎 默认事务型引擎,最重要最广泛的存储引擎,性能非常优秀. 数据存储在共享表空间,可以通过配置分开. 对主键查询的性能高于其他类型的存储引擎. 内部做了很多优化,从磁盘读 ...
- 分组加密的四种模式(ECB、CBC、CFB、OFB)
加密一般分为对称加密(Symmetric Key Encryption)和非对称加密(Asymmetric Key Encryption).对称加密又分为分组加密和序列密码.分组密码,也叫块加密(bl ...
- pom.xml实例
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- js关卡函数,throat函数实现,定时运行函数
function throat(callback,num){ var timer = null; callback = callback || function(){}; return functio ...
- Stacking调参总结
1. 回归 训练了两个回归器,GBDT和Xgboost,用这两个回归器做stacking 使用之前已经调好参的训练器 gbdt_nxf = GradientBoostingRegressor(lear ...
- 1021 Deepest Root
这道题的关键在于如何求两个最远的结点,二叉树比较容易一直DFS就能找到,但是普通树就比较麻烦.要先找到一端,再去找另外一端,两端的并集就是答案.因为结点都是对称的,所以两端都是答案.还要注意去重,12 ...