题意:给你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. 转:JSP之include动态包含与静态包含

    原文地址:http://www.cnblogs.com/ygj0930/p/6044676.html JSP中,include是一个经常用到的标签.当应用程序中所有的页面的某些部分(如标题.页脚和导航 ...

  2. java ftp上传文件

    /** * 上传文件到ftp * @param server * @param user * @param pwd * @param filenames */ public static void u ...

  3. spring根据name或者id获取实例

    @Resource(name="beanname") private ClassType scheduler; 其中ClassType需要跟实例的类型对应上.

  4. springboot的filter使用

    package com.filter; import org.springframework.core.annotation.Order; import javax.servlet.*; import ...

  5. Matlab 快捷键 命令

    1. 在命令窗口(Command Window)中: 1) [上.下键]――切换到之前.之后的命令,可以重复按多次来达到你想要的命令 2) clc――清除命令窗口显示的语句,此命令并不清空当前工作区的 ...

  6. 新兴的API(fileReader、geolocation、web计时、web worker)

    requestAnimationFrame() 每次浏览器重绘之前会调用这个方法!!! 它接收一个参数,就是回调函数: 它可以保证在最佳的间隔时间调用传入的回调函数,以达到让屏幕产生最流畅的动画效果. ...

  7. 在asp.net中使用瀑布流,无限加载

    页面中代码 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1 ...

  8. Springmvc 使用 AbstractExcelView 导出excel

    $("#exportBtn").click(function () { location.href = "${pageContext.request.contextPat ...

  9. 基于sendmail的简单zabbix邮件报警

    1.修改zabbix server hostname声明:在配置zabbix的Email报警之前,需要将sendmail使用的域名进行相应的修改,系统默认为localhost.localdomain, ...

  10. wps去广告

    彻底解决WPS弹出热点广告.WPS购物图标的办法 方法一:(一定有效) https://www.cnblogs.com/ytaozhao/p/5654149.html 一直用WPS,但一直有一个问题迟 ...