• codeforce 10065 (BFS)


      题目:是说,这里有n个水坑,有初始水量,和额度水量。当水坑中的水的总和大于额度水量时,多余的水会平均的分给与该水坑连接的水坑,(水坑与水坑之间是有向的)

      然后题目给定最开始给 X 水坑加入 Y  水,最后查询Z水坑存在多少水。

      很好理解,主要是BFS的实现。。

      

      

     1 #include <cstdio>
     2 #include <vector>
     3 #include <iostream>
     4 #include <cstring>
     5 #include <queue>
     6 #include <cmath>
     7 using namespace std;
     8 typedef long long ll;
     9 #define maxn 1000000
    10 
    11 int n,k,x,y,z;//水坑数量,连接数量,初始加入水的水坑号,初始加入水量,查询水坑号
    12 pair <double ,double >A[maxn];//存放水坑的额度水量和初始水量
    13 vector <int> e[maxn];//存放于水坑i连接的水坑
    14 queue <int >q;
    15 int vis[maxn];
    16 
    17 
    18 void bfs()
    19 {
    20     while (!q.empty())
    21     {
    22         int cut=q.front();q.pop();
    23         vis[cut]=0;
    24 
    25         if(cut==z) return ;
    26         int Size=e[cut].size();
    27         double add=(A[cut].first-A[cut].second)/(double)Size;
    28 
    29         A[cut].first=A[cut].second;
    30         for(int i=0;i<Size;i++)
    31         {
    32             int v=e[cut][i];
    33             A[v].first+=add;
    34             if(A[v].first > A[v].second  && !vis[v]) {
    35                 q.push(v);
    36                 vis[v]=1;
    37             }
    38         }
    39     }
    40 }
    41 int main()
    42 {
    43     scanf ("%d %d",&n,&k);
    44     for (int i=1;i<=n;i++) scanf ("%lf %lf",&A[i].second,&A[i].first);
    45 
    46     for(int i=1;i<=k;i++)
    47     {
    48         int v,u;
    49         scanf ("%d %d",&v,&u);
    50         e[v].push_back(u);
    51     }
    52 
    53     scanf ("%d %d %d",&x,&y,&z);
    54     A[x].first+=(double)y;
    55 
    56     if(A[x].first>A[x].second)   q.push(x);
    57     memset(vis,0,sizeof(vis));
    58     bfs();
    59     double ans=0;
    60     if(A[z].first>A[z].second)  ans=A[z].second;
    61     else  ans=A[z].first;
    62 
    63     printf("%lf
    ",ans);
    64     return 0;
    65 }

      感觉bfs还是比较好用的东西,学习了

  • 相关阅读:
    java内存回收机制
    scala学习
    [java实现]找一个数组的最大和的连续子数组(时间复杂度 O(n))
    linux 进程的创建
    linux中的进程和线程
    linux 文件系统
    gdb 调试程序
    makefile
    linux下的gcc编译器
    socket 网络编程
  • 原文地址:https://www.cnblogs.com/bei-insomia/p/4717628.html
Copyright © 2020-2023  润新知