In Action HDU3339
这是最短路问题和01背包问题的相结合
第一次用01背包
把j打成了i检查了半个小时 下次要注意!
使用的油耗相当于容量 而power相当于价值
先用dijkstra把从基地到所有路的最短情况算出来
然后开始01背包
所有最短路的油耗相加就是总的容量
然后开始dp【j】 算出油耗为j时能获取的最大power
大于总的power的一半时输出
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include<cstdio>
using namespace std; #define INF 0x3f3f3f3f
#define M 110 int m1[M][M];
int dis[M];
int vis[M];
int n;
int v[M]; void dijkstra()
{
memset(vis,,sizeof(vis)); for(int i=;i<=n;i++)dis[i]=INF;
dis[]=;
vis[]=;
for(int i=;i<=n;i++)
{
int minn=INF;
int u=;
for(int j=;j<=n;j++)
{
if(!vis[j]&&minn>dis[j])
{
u=j;minn=dis[j];
} }
vis[u]=;
for(int j=;j<=n;j++)
{ if(!vis[j]&&dis[u]+m1[u][j]<dis[j])
dis[j]=dis[u]+m1[u][j]; } } } int main()
{
int cas;scanf("%d",&cas);
while(cas--)
{
int m;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
if(i==j)m1[i][j]=;
else m1[i][j]=INF;
} while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(m1[a][b]>c)m1[a][b]=m1[b][a]=c; } int sumpower=;
for(int i=;i<=n;i++)
{
int x;scanf("%d",&x);
v[i]=x;
sumpower+=x;
}
sumpower/=;
dijkstra(); int dp[]={};
memset(dp,,sizeof(dp));
int oil=;
for(int i=;i<=n;i++)
{
if(dis[i]!=INF)oil+=dis[i];
} for(int i=;i<=n;i++)
{
if(dis[i]!=INF)
{ for(int j=oil;j>=dis[i];j--)
{ dp[j]=max(dp[j],dp[ j-dis[i] ]+v[i]); }
} }
int ok=;int i;
for( i=;i<=oil;i++)
{
if(dp[i]>sumpower)
{
ok=;break;
} }
if(ok)
printf("impossible\n");
else
printf("%d\n",i); }
return ; }
回顾
#include<iostream>
#include<queue>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std; #define N 110
#define inf 0x3f3f3f3f
int dp[]; int n,e,m,s;
int vis[N],dis[N],mp[N][N];
int power[N]; void dijkstra(int s)
{
memset(vis,,sizeof vis);
for(int i=;i<=n;i++)dis[i]=mp[s][i];
dis[s]=; for(int i=;i<=n;i++)
{
int minn=inf,u=-; for(int j=;j<=n;j++)
if(dis[j]<minn&&!vis[j])
{
minn=dis[j];u=j;
}
if(u==-)return ;
vis[u]=;
for(int j=;j<=n;j++)
dis[j]=min(dis[j],dis[u]+mp[u][j]);
}
} int main()
{
int cas;cin>>cas;
while(cas--)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
if(i==j)mp[i][j]=;
else mp[i][j]=inf;
}
long long oil=;
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c); if(mp[a][b]>c)mp[a][b]=mp[b][a]=c; }
int sum=;
for(int i=;i<=n;i++)
{
scanf("%d",&power[i]);
sum+=power[i];
} dijkstra();
//背包 价值为能量 容量为耗油
for(int i=;i<=n;i++)
if(dis[i]!=inf)oil+=dis[i]; memset(dp,,sizeof dp); for(int i=;i<=n;i++)
for(int j=oil;j>=dis[i];j--)
dp[j]=max(dp[j],dp[j-dis[i]]+power[i]);
sum/=;
int i;
for(i=;i<=oil;i++)
if(dp[i]>sum)
{
printf("%d\n",i);break;
}
if(i==oil+)
printf("impossible\n");
}
return ;
}
In Action HDU3339的更多相关文章
- HDU-3339 IN ACTION(Dijkstra +01背包)
Since 1945, when the first nuclear bomb was exploded by the Manhattan Project team in the US, the ...
- hdu3339 In Action(Dijkstra+01背包)
/* 题意:有 n 个站点(编号1...n),每一个站点都有一个能量值,为了不让这些能量值连接起来,要用 坦克占领这个站点!已知站点的 之间的距离,每个坦克从0点出发到某一个站点,1 unit dis ...
- HDU3339 In Action 【最短路】+【01背包】
<题目链接> 题目大意: 给出一个0-n组成的图,1-n的点上分布着值为pow的电站,给出图的m条边以及距离,从0出发到n个点中的x个点的行走距离和最小(因为是每炸一个点派出一辆坦克),且 ...
- redux-amrc:用更少的代码发起异步 action
很多人说 Redux 代码多,开发效率低.其实 Redux 是可以灵活使用以及拓展的,经过充分定制的 Redux 其实写不了几行代码.今天先介绍一个很好用的 Redux 拓展-- redux-amrc ...
- 尝试asp.net mvc 基于controller action 方式权限控制方案可行性
微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...
- ASP.NET Core 中文文档 第四章 MVC(4.1)Controllers, Actions 和 Action Results
原文:Controllers, Actions, and Action Results 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:许登洋(Seay) Action 和 acti ...
- java中Action层、Service层和Dao层的功能区分
Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...
- SpringMVC的Action在同一时间里只允许同一个浏览器的单次进入?
最近用SpringMVC写了一个很简单的测试程序,代码如下: @Controller public class LongTimeTaskController { @RequestMapping(val ...
- No result defined for action com.lk.IndexAction and result success
意图访问一个 /es/index.action 竟然出现: [SAE ] ERROR [05-11 13:54:32] [http-80-5] com.opensymphony.xwork2.util ...
随机推荐
- luogu 4158 粉刷匠 dp套dp
dp套dp 每个木板是个递推的dp,外部是个分组背包 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i&l ...
- Linux - 账户切换授权
sudo 切换账户 echo myPassword | sudo -S ls /tmp # 直接输入sudo的密码非交互,从标准输入读取密码而不是终端设备 visudo # sudo命令权限添加 /e ...
- org.springframework.beans.BeanUtils与org.apache.commons.beanutils.BeanUtils的copyProperties用法区别
知识点 org.springframework.beans.BeanUtils与org.apache.commons.beanutils.BeanUtils都提供了copyProperties方法,作 ...
- python - socketserver 模块应用
server端: import socketserver import subprocess import json import struct class MyTCPHandler(socketse ...
- Codeplex最流行25个开源项目
1. VMukti富媒体协作平台 2. Microsoft SQL Server Product Samples: Engine 3. Patterns & Practices: Enterp ...
- GitHub:Awesome-Hacking(黑客技能列表-恶意代码)
0 初衷 GitHub这一份黑客技能列表很不错,包含了多个方向的安全.但目前我关注只有逆向工程与恶意代码,所以其他的被暂时略过. 虽然很感谢作者的辛勤付出,但并不打算复制粘贴全套转载.逐条整理是为了从 ...
- 简述JavaScript作用域与作用域链
关于变量作用域的知识,相信学习JavaScript的朋友们一定早已经接触过,这里简单列举: JavaScript中变量是以对象属性的形式存在的:全局变量是全局对象的属性:局部变量是声明上下文对象的属性 ...
- VMware如何给虚拟机添加新硬盘
在使用虚拟机时,若硬盘空间不足.或需要用到双硬盘或多硬盘环境时,我们可以给虚拟机新增虚拟硬盘
- 基于 OpenSSL 的 CA 建立及证书签发
http://rhythm-zju.blog.163.com/blog/static/310042008015115718637/ 建立 CA 建立 CA 目录结构 按照 OpenSSL 的默认配置建 ...
- 使用光盘搭建本地yum源
刚装好的系统,想安装一些常用软件和一些包组的时候,就可以使用安装光盘搭建本地yum 第一步:挂载安装光盘 mount /dev/cdrom /mnt 第二步:编辑repo yum源文件 [root@l ...