HDU 3339 In Action 解题报告(最短路+背包)
发布日期:2021-08-16 15:55:30 浏览次数:3 分类:技术文章

本文共 1277 字,大约阅读时间需要 4 分钟。

题目链接:

晚上看图论500的时候看到一个最短路+背包的题,有点感兴趣,于是花了一个多小时A了这题。

题目大意:恐怖分子欲炸地球,引爆核弹需要用一半的电。而电分布在不同的电站。每个电站都存有不同的电。目的是派出坦克,毁坏电站,使其无法引爆。

给出无向图,要求以最小总距离,毁坏一半以上的电。 注意每个电站都需要一个坦克。

每个电站都有自己的花费(0到它的最短路),以及价值(电量)。于是转化为最少的花费去点一半以上电量问题。 本题还有一些细节需要注意。

AC代码:

#include
#include
#include
#include
#include
#include
#include
#include
#define MAXN 105#define INF 1000using namespace std;int map[MAXN][MAXN],w[MAXN],v[MAXN],used[MAXN],dp[505005];int max(int a,int b) {return a>b?a:b;}int main(){// freopen("in.txt","r",stdin); int i,j,n,m,t,a,b,c,topv,f=0; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=0;i<=n;i++) { for(j=0;j<=n;j++) map[i][j]=1000; map[i][i]=0; } for(i=0;i
w[i]) { mini=w[i]; k=i; } if(k==0) break; //找不到路径,退出 used[k]=1; sum+=w[k]; sumv+=v[k]; for(i=1;i<=n;i++) if(!used[i] && w[i]>w[k]+map[k][i]) { w[i]=w[k]+map[k][i]; } } if(sumv+f<=topv)//全部能到达的点都不够一半,输出。 { printf("impossible\n"); continue; } memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) { for(j=sum;j>=w[i];j--) { dp[j]=max(dp[j],dp[j-w[i]]+v[i]); } } int ans=0; for(i=0;i<=sum;i++) if(dp[i]+f>topv) { ans=i; break; } printf("%d\n",ans); } return 0;}

转载于:https://www.cnblogs.com/javaspring/archive/2012/08/25/2656031.html

转载地址:https://blog.csdn.net/weixin_30810239/article/details/98582886 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Vuex以及axios
下一篇:android执行Linux命令

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月07日 09时29分56秒