题目描述

汶川地震发生时,四川**中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边。1号点为教室,n号点为安全地带,每条边都只能容纳一定量的学生,超过楼就要倒塌,由于人数太多,校长决定让同学们分成几批逃生,只有第一批学生全部逃生完毕后,第二批学生才能从1号点出发逃生,现在请你帮校长算算,每批最多能运出多少个学生,x名学生分几批才能运完。

输入输出格式

输入格式:

第一行3个整数n,m,x(x<2^31,n<=200,m<=2000);以下m行,每行三个整数a,b,c(a1,a<>b,0描述一条边,分别代表从a点到b点有一条边,且可容纳c名学生。

输出格式:

两个整数,分别表示每批最多能运出多少个学生,x名学生分几批才能运完。如果无法到达目的地(n号点)则输出“Orz Ni Jinan Saint Cow!”

输入输出样例

输入样例#1:

6 7 7
1 2 1
1 4 2
2 3 1
4 5 1
4 3 1
3 6 2
5 6 1
输出样例#1:

3 3

说明

【注释】

比如有图

1 2 100

2 3 1

100个学生先冲到2号点,然后1个1个慢慢沿2-3边走过去

18神牛规定这样是不可以的……

也就是说,每批学生必须同时从起点出发,并且同时到达终点

来一发Dinic。

这题比较少,我们想一下,如果要输送学生,我们只要找出每次可以通过的最大的学生数量就好。

然后用一点贪心的原理,每次都去用最大的输送方案输送学生(废话。。)

只要最大流不为0就一定能输送完成

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#define lli long long int
using namespace std;
const int MAXN=;
const int maxn=0x7fffff;
void read(int &n)
{
char c='+';int x=;bool flag=;
while(c<''||c>'')
{c=getchar();if(c=='-')flag=;}
while(c>=''&&c<='')
{x=(x<<)+(x<<)+c-;c=getchar();}
flag==?n=-x:n=x;
}
struct node
{
int u,v,flow,cap,nxt;
}edge[MAXN];
int head[MAXN];
int num=;
int n,m,S,T,x;
int dis[MAXN];
int vis[MAXN];
int cur[MAXN];
void add_edge(int x,int y,int z)
{
edge[num].u=x;
edge[num].v=y;
edge[num].cap=z;
edge[num].flow=;
edge[num].nxt=head[x];
head[x]=num++;
}
bool bfs(int bg,int ed)
{
memset(dis,-,sizeof(dis));
queue<int>q;
q.push(bg);
dis[bg]=;
while(!q.empty())
{
int p=q.front();
q.pop();
for(int i=head[p];i!=-;i=edge[i].nxt)
{
if(dis[edge[i].v]==-&&edge[i].cap>edge[i].flow)
{
vis[edge[i].v]=;
dis[edge[i].v]=dis[edge[i].u]+;
q.push(edge[i].v);
}
}
}
if(dis[ed]==-)
return ;
else return ;
}
int dfs(int now,int a)// a:所有弧的最小残量
{
if(now==T||a<=)
return a; int flow=,f;
for(int i=head[now];i!=-;i=edge[i].nxt)
{
if(dis[now]+==dis[edge[i].v]&&edge[i].cap-edge[i].flow>)
{
f=dfs(edge[i].v,min(a,edge[i].cap-edge[i].flow));
edge[i].flow+=f;
edge[i^].flow-=f;
flow+=f;
a-=f;
if(a<=)break;
}
}
return flow;
}
void Dinic(int S,int T)
{
int ansflow=;
int cs=;
int maxflow=;
for(int i=;i<=n;i++)
cur[i]=head[i];
while(bfs(S,T))
{
int p=dfs(S,maxn);
cs++;
ansflow+=p;
maxflow=max(maxflow,p);
}// 求出层级
if(ansflow==)
printf("Orz Ni Jinan Saint Cow!");
else
printf("%d %d",ansflow,(x%ansflow)==?(x/ansflow):(x/ansflow+)); //printf("%d",ansflow); }
int main()
{
scanf("%d%d%d",&n,&m,&x);
//read(n);read(m);read(x);
// swap(n,m);
S=;T=n;
// read(S);read(T);
for(int i=;i<=n;i++)
head[i]=-;
for(int i=;i<=m;i++)
{
int x,y,z;
//read(x);read(y);read(z);
scanf("%d%d%d",&x,&y,&z);
add_edge(x,y,z);
add_edge(y,x,);
}
Dinic(S,T);
return ;
}

P1343 地震逃生的更多相关文章

  1. 洛谷 P1343 地震逃生

    P1343地震逃生 题目描述 汶川地震发生时,四川**中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边.1号点为教室,n号点为安全地带,每 ...

  2. P1343 地震逃生(最大流板题)

    P1343 地震逃生 题目描述 汶川地震发生时,四川**中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边.1号点为教室,n号点为安全地带, ...

  3. 【luogu P1343 地震逃生】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1343 菜 #include <queue> #include <cstdio> #i ...

  4. [洛谷P1343]地震逃生

    题目大意:有n个点m条单向边,每条边有一个容量.现有x人要分批从1走到n,问每批最多能走多少人,分几批运完(或输出无法运完). 解题思路:一看就是网络流的题目.每批最多能走多少人,即最大流.分几批运完 ...

  5. 「洛谷P1343」地震逃生 解题报告

    P1343 地震逃生 题目描述 汶川地震发生时,四川XX中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边.1号点为教室,n号点为安全地带, ...

  6. 洛谷 P10P1343 地震逃生 改错

    P1343 地震逃生 题目描述 汶川地震发生时,四川**中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有\(n\)个点,\(m\)条边.1号点为教室,\ ...

  7. 【洛谷P1343】地震逃生

    一道傻吊的网络流题,wori我写的读入优化怎么老T? 远离读入优化报平安? #include<bits/stdc++.h> #define N 4005 #define inf 10000 ...

  8. LG1343 地震逃生

    题意 汶川地震发生时,四川**中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边.1号点为教室,n号点为安全地带,每条边都只能容纳一定量的学 ...

  9. 【u033】地震逃生

    Time Limit: 1 second Memory Limit: 64 MB [问题描述] 汶川地震发生时,四川**中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一 ...

随机推荐

  1. CSS 弹性盒

    图片新窗口打开浏览

  2. java学习笔记5——String类常用方法

    1.字符串长度计算: int i = String1.length(); 2.字符串比较:1) equals()和equalsIgnoreCase //比较两个字符串对象的实体是否相同,相同输出tru ...

  3. RxSwift學習教程之基礎篇

    前言 我們在 iOS 開發過程中,幾乎無時無刻都要面對異步事件的處理.例如,按鍵點擊.數據保存..音頻後臺播放.交互動畫展示.這些事件並不具備特定時序性,甚至它們可能同時發生. 雖然 Apple 提供 ...

  4. 获取Centos7安装Docker各种姿势(指定版本)(转载)

    Centos7安装docker社区(CE)版 官网指导:https://docs.docker.com/engine/installation/linux/docker-ce/centos/#inst ...

  5. BZOJ 5508: [Tjoi2019]甲苯先生的字符串 矩阵乘法_思维

    求 $f[i][j]=∑f[i−1][k]$,$'a'<=k<='z'$ . 用矩阵乘法转移一波即可. 竟然独自想出来了QAQ Code: #include <bits/stdc++ ...

  6. 何为DOM对象

    <html> <head> <title>DOM对象</title> <link href="/Content/Site.css&quo ...

  7. 报错The jarsigner could not be found. Make sure to run with the build with a JDK。的解决方法

    这种报错是因为eclipse启动时没有走你设置的jdk路径,eclipse走的路径/bin下没有jarsigner.exe.所以报错,解决办法: 指定eclipse启动jdk 按住alt键,用鼠标拖动 ...

  8. Linux 查看用户命令

    1.Linux里查看所有用户 (1)在终端里.其实只需要查看 /etc/passwd文件就行了. (2)看第三个参数:500以上的,就是后面建的用户了.其它则为系统的用户. 或者用cat /etc/p ...

  9. 【codeforces 731E】Funny Game

    [题目链接]:http://codeforces.com/contest/731/problem/E [题意] 两个人轮流玩游戏; 取序列中的前k(k>1)个数字,拿出来; 把这k个数字全部加起 ...

  10. hive join 优化 --小表join大表

    1.小.大表 join 在小表和大表进行join时,将小表放在前边,效率会高.hive会将小表进行缓存. 2.mapjoin 使用mapjoin将小表放入内存,在map端和大表逐一匹配.从而省去red ...