题目:是说,这里有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\n",ans); 64 return 0; 65 }
感觉bfs还是比较好用的东西,学习了
时间: 2024-11-06 11:10:08