HDOJ 3339 In Action (Dijstra + 01 背包)
来源:互联网 发布:写作神器软件下载 编辑:程序博客网 时间:2024/06/14 23:07
点击打开链接
题意:给定 0点、n个能源站(编号从1 - n)和连接它们的m条无向路径,已知每个能源站含有的能源和每条路径的长度。你到达一个能源站便可以获得该站的所有能源,现在要求你从0点出发且获得的能源大于总能源的一半,问所需要走的最少距离。有足够多的坦克从0点出发,去往能源站,所有能源站的能源取走一次就没有了。
总能源的一半不用分类讨论,s/2本来就是整除。
这道题把dist[i]看成物品的体积,pow[i]看成物品的价值,背包容量为D(把所有可以从0出发到达的能源站的最短路径长都加起来,坦克最多可以走那么多)。f[i]表示所装物品的体积为i的时候,所装的物品最大的价值。最后体积从0开始找,找到第一个f[i]满足要求,就输出体积i,此时就是所求的最小值。
#include<cstdio>#include<cstring>const int INF = 0x3f3f3f3f;const int N = 105;int c[N][N], pow[N], dist[N];bool S[N];int f[10100];int main(){ int T, n, m, dis, st, ed, mindist, s, u, ans, sd, v0; scanf("%d", &T); while (T--) { scanf("%d%d", &n, &m); for (int i = 0; i <= n; i++) for (int j = 0; j <= n; j++) c[i][j] = INF; for (int i = 1; i <= m; i++) { scanf("%d%d%d", &st, &ed, &dis); if (dis < c[st][ed]) { c[st][ed] = dis; c[ed][st] = dis; } } s = 0; for (int i = 1; i <= n; i++) { scanf("%d", &pow[i]); s += pow[i]; } v0 = 0; for (int i = 0; i <= n; i++) { S[i] = false; dist[i] = c[v0][i]; } S[v0] = true; dist[v0] = 0; for (int i = 1; i <= n; i++) { mindist = INF; u = v0; for (int j = 0; j <= n; j++) if (!S[j] && dist[j] < mindist) { mindist = dist[j]; u = j; } S[u] = true; for (int j = 0; j <= n; j++) if (!S[j] && c[u][j] != INF && c[u][j] + dist[u] < dist[j]) dist[j] = c[u][j] + dist[u]; } int D = 0; for (int i = 1; i <= n; i++) if (dist[i] != INF) D += dist[i]; memset(f, 0, sizeof(f)); for (int i = 1; i <= n; i++) for (int j = D; j >= dist[i]; j--) if (f[j-dist[i]] + pow[i] > f[j]) f[j] = f[j-dist[i]] + pow[i]; sd = s / 2 + 1; ans = -1; for (int i = 0; i <= D; i++) if (f[i] >= sd) {ans = i;break;} if (ans != -1) printf("%d\n", ans); else printf("impossible\n"); } return 0;}
0 0
- HDOJ 3339 In Action (Dijstra + 01 背包)
- HDOJ-3339-In Action【dijkstra & 01背包】
- hdoj In Action 3339 (dijiks++01背包) 好题
- hdoj--3339--In Action(最短路+01背包)
- HDOJ 3339 In Action(最短路+01背包)
- HDOJ 3339 In Action (最短路+01背包)
- hdoj 3339 In Action【最短路+01背包】
- hdoj 3339 In Action 【最短路 + 01背包】
- hdoj 3339 In Action【SPFA + 0-1背包】
- HDOJ 3339 In Action
- HDOJ 3339 In Action
- 【hdu 3339】 In Action (Dijkstra+01背包)
- hdu 3339 In Action(最短路+01背包)
- HDU 3339 In Action (dijkskra+01背包)
- HDU 3339 In Action(最短路+01背包)
- hdu 3339 In Action (Dijkstra+01背包)
- HDU-3339-In Action(Dijkstra+01背包)
- HDU 3339--In Action【Floyd+01背包】
- 1017. A除以B (20)
- spring struts2 mybatis框架学习总结(mvc三层架构)
- mysql服务老是不见
- Linux 常见命令小技巧集锦
- hdu 1241 Oil Deposits
- HDOJ 3339 In Action (Dijstra + 01 背包)
- poj1273 Drainage Ditches(最大流入门)
- 淫欲的真相是什么呢?可能很多英雄豪杰都没有想到过
- Linux文件操作 -- lseek实践
- git:branch is published (but not merged) and is now commits behind
- hdoj--1258--Sum It Up(dfs)
- java学习心得——添加列表查询功能
- 【MinaFile】【十三】【2.0】关于粘包的处理
- 论__HashCode和内容Length做快速去重有多不靠谱