【HDU】3696 Farm Game

SPFA求最短路径。见图的时候注意逆向建图。

  1 /* 3696 */
  2 #include <iostream>
  3 #include <queue>
  4 #include <vector>
  5 #include <algorithm>
  6 #include <cstdio>
  7 #include <cstring>
  8 #include <cmath>
  9 #include <cstdlib>
 10 using namespace std;
 11
 12 #define MAXN 10005
 13 #define MAXV 10005
 14 #define MAXE 50005
 15
 16
 17 typedef struct {
 18     int v, next;
 19     double r;
 20 } Edge_t;
 21
 22 const double INF = 9999999.;
 23 Edge_t E[MAXE];
 24 int L, head[MAXN];
 25 double w[MAXN], p[MAXN];
 26 double rate[MAXN];
 27 bool visit[MAXN];
 28 int n, m;
 29
 30 void addEdge(int u, int v, double r) {
 31     E[L].v = v;
 32     E[L].next = head[u];
 33     E[L].r = r;
 34     head[u] = L++;
 35 }
 36
 37 void init() {
 38     memset(head, -1, sizeof(int)*(n+1));
 39     L = 0;
 40 }
 41
 42 void spfa(int u) {
 43     int i, j, k, v;
 44     queue<int> Q;
 45
 46     for (i=0; i<=n; ++i)
 47         rate[i] = -INF;
 48     memset(visit, false, sizeof(visit));
 49     rate[u] = 0.0;
 50     visit[u] = true;
 51     Q.push(u);
 52
 53     while (!Q.empty()) {
 54         u = Q.front();
 55         Q.pop();
 56         visit[u] = false;
 57         for (i=head[u]; i!=-1; i=E[i].next) {
 58             v = E[i].v;
 59             if (rate[v] < rate[u]+E[i].r) {
 60                 rate[v] = rate[u] + E[i].r;
 61                 if (!visit[v]) {
 62                     visit[v] = true;
 63                     Q.push(v);
 64                 }
 65             }
 66         }
 67     }
 68 }
 69
 70 int main() {
 71     int i, j, k;
 72     int u, v;
 73     double r, ans;
 74
 75     #ifndef ONLINE_JUDGE
 76         freopen("data.in", "r", stdin);
 77         freopen("data.out", "w", stdout);
 78     #endif
 79
 80     while (scanf("%d",&n)!=EOF && n) {
 81         init();
 82         for (i=1; i<=n; ++i) {
 83             scanf("%lf %lf", &p[i], &w[i]);
 84             addEdge(0, i, log(p[i]));
 85         }
 86         scanf("%d", &m);
 87         while (m--) {
 88             scanf("%d %d", &k, &u);
 89             --k;
 90             while (k--) {
 91                 scanf("%lf %d", &r, &v);
 92                 addEdge(v, u, log(r));
 93                 u = v;
 94             }
 95         }
 96         spfa(0);
 97         ans = 0.0;
 98         for (i=1; i<=n; ++i) {
 99             r = exp(rate[i]);
100             if (p[i] < r)
101                 p[i] = r;
102             ans += p[i]*w[i];
103         }
104         printf("%.2lf\n", ans);
105     }
106
107     return 0;
108 }
时间: 2024-08-30 14:30:39

【HDU】3696 Farm Game的相关文章

【HDU】2147 kiki&#39;s game

http://acm.hdu.edu.cn/showproblem.php?pid=2147 题意:n×m的棋盘,每次可以向左走.向下走.向左下走,初始在(1, m),n,m<=2000,问先手是否胜利. #include <cstdio> using namespace std; int main() { int n, m; while(scanf("%d%d", &n, &m), n|m) (n&1)&&(m&1)?

【HDU】4923 Room and Moor(2014多校第六场1003)

Room and Moor Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 263    Accepted Submission(s): 73 Problem Description PM Room defines a sequence A = {A1, A2,..., AN}, each of which is either 0

【HDOJ】1198 Farm Irrigation

其实就是并查集,写麻烦了,同样的代码第一次提交wa了,第二次就过了. 1 #include <stdio.h> 2 #include <string.h> 3 4 #define MAXNUM 55 5 #define UP 0 6 #define RIGHT 1 7 #define DOWN 2 8 #define LEFT 3 9 10 char buf[MAXNUM][MAXNUM]; 11 int bin[MAXNUM*MAXNUM]; 12 char visit[MAXN

【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】

传送门:pid=4888">[HDU]4888 Redraw Beautiful Drawings 题目分析: 比赛的时候看出是个网络流,可是没有敲出来.各种反面样例推倒自己(究其原因是不愿意写暴力推断的).. 首先是简单的行列建边.源点向行建边.容量为该行元素和,汇点和列建边.容量为该列元素和.全部的行向全部的列建边,容量为K. 跑一次最大流.满流则有解,否则无解. 接下来是推断解是否唯一. 这个题解压根没看懂.还是暴力大法好. 最简单的思想就是枚举在一个矩形的四个端点.设A.D为主对角

【HDU】4918 Query on the subtree 点分治+树状数组

传送门:[HDU]4918 Query on the subtree 题目分析: 首先,简化问题. 1.求一次到点u的距离不超过d的点的个数.很容易,一次O(NlogN)的点分治便可以完成. 2.多次进行操作1.此时不能每次都O(NlogN)了,太慢了.我们考虑到对于点分治,树的重心一共有logN层,第一层为整棵树的重心,第二层为第一层重心的子树的重心,以此类推,每次至少分成两个大小差不多的子树,所以一共有logN层.而且,对于一个点,他最多只属于logN个子树,也就是最多只属于logN个重心.

【HDU】1754 I hate it ——线段树 单点更新 区间最值

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 37448    Accepted Submission(s): 14816 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要

【HDU】 1160 FatMouse&#39;s Speed (DP)

一开始写的dfs进行记忆化结果不知道怎么进行路径的记录...改成循环就好了 dp[i] = max(dp[j]) + 1 , weight[j] < weight[j] && speed[j] > speed[i] 一开始进行一次排序使得重量递增,这样只需要考虑速度就好了 #include<cstdio> #include<algorithm> using namespace std; const int maxn = 10005; struct Mou

【hdu】Mayor&#39;s posters(线段树区间问题)

需要离散化处理,线段树的区间修改问题. 需要注意的就是离散化的时候,由于给的数字是一段单位长度,所以需要特殊处理(因为线段的覆盖和点的覆盖是不一样的) 比如:(1,10)(1,4) (6,10) 离散化之后是 1 , 4 , 6 , 10 分别离散为 1 2 3 4 覆盖的时候先覆盖1 4 之后覆盖了1 2 之后覆盖了 2 3,结果为2 但是实际上应该是3 13450359 201301052100 2528 Accepted 1140K 985MS C++ 1960B 2014-09-17 1

【HDU】4908 (杭电 BC #3 1002题)BestCoder Sequence ——哈希

BestCoder Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 573    Accepted Submission(s): 201 Problem Description Mr Potato is a coder.Mr Potato is the BestCoder. One night, an amazing s