• Codeforces gym 100685 F. Flood bfs


    F. Flood
    Time Limit: 20 Sec

    Memory Limit: 256 MB

    题目连接

    http://codeforces.com/gym/100685/problem/F

    Description

    We all know that King Triton doesn't like us and therefore shipwrecks, hurricanes and tsunami do happen. But being bored with the same routine all these years Triton has decided to make a spectacular flood this year.

    He chose a small town in a hilly valley not far from the sea. The power of Triton is enough to pour one heavy rain on the hill. He is worried however that water will miss that chosen town due to various river basins and water flows. Triton asks you to help him help calculate the amount of water that reaches the chosen town.

    There are water ponds in a hilly valley on the way to the town. Some of them are connected to each other with rivers. If some pond is overfull with water, the water begins to flow evenly to the connected ponds (or to the sea, if there are no connected ponds). Each pond contains some water initially, and the maximum pond capacity is also known. The chosen town is located on the bank of one pond — you should calculate the water level in this pond after all water flow is run out.

    Input

    On the first line of input integers N and K (2 ≤ N ≤ 104, 0 ≤ K ≤ 105) are given — the number of water ponds and the number of pond connections respectively.

    On the next N lines of input integers Pi and Ai (0 ≤ Ai ≤ Pi ≤ 106) are given — these are the maximum ith water pond capacity and its initial water level.

    On the next K lines of input integers Fj and Tj (1 ≤ Fj, Tj ≤ N, Fj ≠ Tj) are given — they denote a possible river flow connection from Fj to Tj water pond (reverse water flow is not possible). Consider water flow from a pond to be equally distributed between all possible flow connections from that pond. Triton is absolutely sure that there are no cycles in river flows between the ponds, and there are no multiple rivers between any two ponds.

    On the last line of input integers X, Y and Z (1 ≤ X, Z ≤ N, 1 ≤ Y ≤ 106) are given — the water pond that receives Triton's heavy rain, the amount of water that is added to this pond and the target pond (near the chosen town) to test respectively.

    Consider that excessive water flows from a water pond if and only if its capacity is full. If some pond is overfull and no water flows are defined from that pond consider that all excessive water has flown out to the sea.

    Output

    The first line of the output should contain a single floating-point number Lz — the final water level in the target pond when all water flow is complete. Answers with absolute or relative error less than 10 - 4 are considered correct.

    Sample Input

    4 4
    10 10
    1 0
    1 0
    10 0
    1 2
    1 3
    2 4
    3 4
    1 5 4

    Sample Output

    3.0

    HINT

    题意

    给一个有向无环无重边的图,然后从一个地方倒水,水满了就会溢出,溢出给所有相邻的点,都平均给,然后问你最后有多少水

    题解

    直接bfs就好了

    代码

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <vector>
    #include <stack>
    #include <map>
    #include <set>
    #include <queue>
    #include <iomanip>
    #include <string>
    #include <ctime>
    #include <list>
    typedef unsigned char byte;
    #define pb push_back
    #define input_fast std::ios::sync_with_stdio(false);std::cin.tie(0)
    #define local freopen("in.txt","r",stdin)
    #define pi acos(-1)
    
    using namespace std;
    typedef pair<double , double > dl;
    const int maxn = 1e4 + 50;
    vector<int>e[maxn];
    int n , k , z ;
    int dis[maxn];
    char inq[maxn];
    dl A[maxn];
    queue<int>q;
    double ans;
    double dig[maxn];
    
    void bfs()
    {
        while(!q.empty())
        {
            int cur = q.front();q.pop();
            inq[cur] = 0;
            if (cur == z) return;
            int degree = e[cur].size();
            double add = (A[cur].first - A[cur].second)/((double)degree);
            A[cur].first = A[cur].second;
            for(int i = 0 ; i < degree ; ++ i)
            {
                int v = e[cur][i];
                A[v].first += add;
                if (A[v].first > A[v].second && !inq[v])
                {
                    q.push(v);
                    inq[v] = 1;
                }
            }
        }
    }
    
    
    int main(int argc,char *argv[])
    {
      scanf("%d%d",&n,&k);
      for(int i = 1 ; i <= n ; ++ i) scanf("%lf%lf",&A[i].second,&A[i].first);
      while(k--)
      {
          int u , v ;
          scanf("%d%d",&u,&v);
          e[u].pb(v);
      }
      int x,y;
      scanf("%d%d%d",&x,&y,&z);
      A[x].first += (double)y;
      memset(inq,0,sizeof(inq));
      if (A[x].first > A[x].second) q.push(x);
      bfs();
      if (A[z].first > A[z].second ) ans = A[z].second;
      else ans = A[z].first;
      printf("%.8lf
    ",ans);
      return 0;
    }
  • 相关阅读:
    每一个合格的家庭主妇都是生产厂长的有力竞争者
    单点登录在ASP.NET上的简单实现
    Asp.net(C#)给图片加上水印效果
    Asp.net Ajax框架教程
    记入cookie一个ip一天只弹一次的弹窗代码JavaScript实例教程
    【转】ASP.net2。0中解决无法获取 GridView 隐藏列值问题
    javascript 动态添加表格行
    IndexOf方法,LastIndexOf方法,substring方法
    SQL 批量插入数据
    js 前台找控件(table里找控件)
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4702833.html
Copyright © 2020-2023  润新知