hdu3696Farm Game(SPFA求最长路)
来源:互联网 发布:android耗电量优化 编辑:程序博客网 时间:2024/06/05 03:03
题目请戳这里
题目大意:有n种物品,每种有相应的价值和数量。现在给m组关系链,组成一张关系网,表示某物品之间相互转换的关系。求已知的物品能获得的最大价值。
题目分析:每种物品可以直接卖掉,也可以通过转换成价值更高的物品再卖以获取更高的价值。对每个物品的单价建图,求每个物品通过转化所能获得的最大单价,然后再卖掉,可以获得最大价值。设一个源点s,s到每个物品建边,边权log10(p[i]),为相应物品的单价取对数(乘法转化成加法),表示不通过任何交换各个物品的价值。然后对于能够交换的物品(i,j),设单位i可以得到bi的j,j->i建边,边权log10(bi),表面通过j,可以使i的价值发生变化。然后从s跑一遍最长路,最后每种物品的单价*数量便是最大的价值。
详情请见代码:
#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;const int N = 10005;const int M = 25005;typedef __int64 ll;int head[N];struct node{ double val; int to,next;}g[M<<3];int n,m,num;int que[N];bool in[N];int times[N];double dis[N];double ans;double p[N],w[N];void build(int s,int e,double v){ g[num].to = e; g[num].val = v; g[num].next = head[s]; head[s] = num ++;}void SPFA(){ int i,front,rear; for(i = 0;i <= n;i ++) { dis[i] = 0; in[i] = false; times[i] = 0; } front = rear = 0; dis[0] = 0; que[rear ++] = 0; in[0] = true; times[0] ++; while(front != rear) { int u = que[front ++]; if(front == N) front = 0; in[u] = false; for(i = head[u];~i;i = g[i].next) if(dis[g[i].to] < dis[u] + g[i].val) { dis[g[i].to] = dis[u] + g[i].val; if(in[g[i].to] == false)// && times[g[i].to] < n) { in[g[i].to] = true; times[g[i].to] ++; que[rear ++] = g[i].to; if(rear == N) rear = 0; } } }}void solve(){ SPFA(); for(int i = 1;i <= n;i ++) { if(p[i] < pow(10.0,dis[i])) p[i] = pow(10.0,dis[i]); ans += p[i] * w[i]; } printf("%.2lf\n",ans);}int main(){ int i,k,a,b; while(scanf("%d",&n),n) { ans = 0; memset(head,-1,sizeof(head)); num = 0; for(i = 1;i <= n;i ++) { scanf("%lf%lf",&p[i],&w[i]); build(0,i,log10(p[i])); } scanf("%d",&m); while(m --) { scanf("%d",&k); scanf("%d",&a); k --; double pp; while(k --) { scanf("%lf%d",&pp,&b); build(b,a,log10(pp)); a = b; } } solve(); } return 0;}
- hdu3696Farm Game(SPFA求最长路)
- spfa求最长路
- hdu3696(spfa求最长路)
- hdu 1534(差分约束+spfa求最长路)
- hdu 6201 transaction transaction transaction (spfa求最长路)
- HDU 3696 FZU 2006 -- Farm Game SPFA最长路 2010福州区域赛
- SDUT AOE关键路径 SPFA求最长路(倒序建路)
- poj 3592(强连连通分量+缩点+重建图形+spfa求最长路)
- zoj 3088 Easter Holidays (SPFA 求最长路 最短路 + 打印路径)
- POJ 3160 Father Christmas flymouse tarjan缩点+spfa求最长路
- Bellman_Ford变形求最长路+正权回路或spfa——POJ 1860
- poj 3160 Father Christmas flymouse (SCC缩点+SPFA求最长路)
- hdoj 1534 Schedule Problem 【差分约束】【SPFA求最长路】
- Easter Holidays(二次spfa求最短路、最长路+打印路径)
- poj 3160 Father Christmas flymouse 【SCC缩点 + 虚拟源点SPFA求最长路】
- POJ 3126 --Father Christmas flymouse【scc缩点构图 && SPFA求最长路】
- POJ 3592--Instantaneous Transference【SCC缩点新建图 && SPFA求最长路 && 经典】
- poj 3592 Instantaneous Transference (借助强连通分量求缩点在建图spfa求最长路)
- fstream 以可读可写打开依然只能只读或只写
- c++内存对齐
- 笔试与面试集锦
- zookeeper
- C语言中怎样理解三目运算符(条件运算符)的右结合性
- hdu3696Farm Game(SPFA求最长路)
- 在项目中,main文件中都做了一些什么呢
- 数塔--poj3176
- 端口号的作用及常见端口号用途说明
- rmxp4droid 2.4最终版(20131003)
- sql中case when then简单用法
- OCP-1Z0-052-V8.02-20题
- java的23种设计模式
- hdu 4465 Candy(概率公式+极大乘极小,4级)