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还是比较好用的东西,学习了

原文地址:https://www.cnblogs.com/bei-insomia/p/4717628.html