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\n",ans);
64     return 0;
65 }

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

时间: 2024-11-06 11:10:08

codeforce 10065 (BFS)的相关文章

codeforce 14D 无向图 求树的长度 bfs是一种方法 先用dfs做

枚举每一条边  将树分为两部分 分别dfs求出树的直径 从一点开始最长路加次长路为树的直径 #include<iostream> #include<vector>#include<algorithm>using namespace std;vector<int> G[100000];int n,s;inline int max(int a,int b)//注意是inline 不然超时{       return a>b?a:b;}int dfs(int

[hdu 2102]bfs+注意INF

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 感觉这个题非常水,结果一直WA,最后发现居然是0x3f3f3f3f不够大导致的--把INF改成INF+INF就过了. #include<bits/stdc++.h> using namespace std; bool vis[2][15][15]; char s[2][15][15]; const int INF=0x3f3f3f3f; const int fx[]={0,0,1,-1};

BFS+康托展开(洛谷1379 八数码难题)

在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变. 输入格式: 输入初试状态,一行九个数字,空格用0表示 输出格式: 只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据) 输入样例#1: 2831

Sicily 1444: Prime Path(BFS)

题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 bool isPrime(int n){//素数判断 5 if(n == 2 || n == 3) return true; 6 else{ 7 int k = sqrt(n) + 1; 8 for(int i = 2; i < k; i

HDU 5925 Coconuts 【离散化+BFS】 (2016CCPC东北地区大学生程序设计竞赛)

Coconuts Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 524    Accepted Submission(s): 151 Problem Description TanBig, a friend of Mr. Frog, likes eating very much, so he always has dreams abou

POJ3967Ideal Path[反向bfs 层次图]

Ideal Path Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 1754   Accepted: 240 Description New labyrinth attraction is open in New Lostland amusement park. The labyrinth consists of n rooms connected by m passages. Each passage is colo

胜利大逃亡(续)(状态压缩bfs)

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 7357    Accepted Submission(s): 2552 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带

邻接表实现Dijkstra算法以及DFS与BFS算法

//============================================================================ // Name : ListDijkstra.cpp // Author : fffff // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //==========================

图的两种遍历-DFS&amp;BFS

DFS和BFS在图中的应用: 图连通性判定:路径的存在性:图中是否存在环:求图的最小生成树:求图的关键路径:求图的拓扑排序. DFS:简单的说,先一直往深处走,直到不能再深了,再从另一条路开始往深处走,直到所有路都走完: struct node { int next; //E[i].next指向图中与i同父的下一个结点 int to; //E[i].to指向图中i的子结点 }E[110]; int N; int fa[110]; //记录各点的父结点 bool vis[110]; //记录这个点