zoukankan      html  css  js  c++  java
  • 洛谷 P1343 地震逃生

    P1343地震逃生

    题目描述

    汶川地震发生时,四川**中学正在上课,一看地震发生,老师们立刻带领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神牛规定这样是不可以的……

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

     1 // 最大流 一遍A  今晚RP and mood++ 
     2 #include<iostream>
     3 #include<queue>
     4 #include<cstring>
     5 #include<cstdio>
     6 using namespace std;
     7 #define maxn 210
     8 #define maxm 2010
     9 #define INF 1e9
    10 struct Edge{
    11     int v,w,next;
    12 }e[maxm*2];
    13 int head[maxn],m,n,X,tot=1,ans,dep[maxn];
    14 void Add_Egde(int u,int v,int w){
    15     e[++tot].v=v;e[tot].w=w;
    16     e[tot].next=head[u];head[u]=tot;
    17     e[++tot].v=u;e[tot].w=0;
    18     e[tot].next=head[v];head[v]=tot;
    19 }
    20 queue<int>q;
    21 bool BFS(int s,int t){
    22     while(!q.empty())q.pop();
    23     memset(dep,-1,sizeof dep );
    24     dep[s]=0;q.push(s);
    25     while(!q.empty()){
    26         int u=q.front();q.pop();
    27         for(int i=head[u];i;i=e[i].next){
    28             int v=e[i].v,w=e[i].w;
    29             if(dep[v]==-1&&w){
    30                 dep[v]=dep[u]+1;
    31                 if(v==t)return true;
    32                 else q.push(v);
    33             }
    34         }
    35     }
    36     return false;
    37 }
    38 int DFS(int u,int flow){
    39     int ret=0;
    40     if(u==n) return flow;
    41     for(int i=head[u];i;i=e[i].next){
    42         int v=e[i].v,w=e[i].w;
    43         if(dep[v]==dep[u]+1&&w){
    44             int x=DFS(v,min(flow-ret,w));
    45             ret+=x;
    46             e[i].w-=x;
    47             e[i^1].w+=x;
    48         }
    49     }
    50     return ret;
    51 }
    52 int Dinic(int s,int t){
    53     while(BFS(s,t))ans+=DFS(1,INF);
    54     return ans;
    55 }
    56 int main(){
    57     scanf("%d%d%d",&n,&m,&X);
    58     for(int i=1,u,v,w;i<=m;i++){
    59         scanf("%d%d%d",&u,&v,&w);
    60         Add_Egde(u,v,w);
    61     }
    62     int max_flow=Dinic(1,n);
    63     if(max_flow==0){
    64         printf("Orz Ni Jinan Saint Cow!
    ");
    65         return 0;
    66     }
    67     if(X%max_flow==0){
    68         printf("%d %d
    ",max_flow,X/max_flow);
    69     }
    70     else printf("%d %d
    ",max_flow,X/max_flow+1); 
    71     return 0;
    72 }
  • 相关阅读:
    WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信
    PHP
    ASP.NET的路由系统:根据路由规则生成URL
    数据库的范式模型
    P2P编程
    MS CRM 2011的自定义与开发(12)——表单脚本扩展开发(4)
    Html.RenderPartial和Html.Partial在Razor视图中的区别
    如何在本地安装 DotNetNuke 6
    ASP.NET的路由系统:路由映射
    ASP.NET Web API: 宿主(Hosting)
  • 原文地址:https://www.cnblogs.com/suishiguang/p/6522448.html
Copyright © 2011-2022 走看看