hdu3339 In Action(Dijkstra+01背包)
/*
题意:有 n 个站点(编号1...n),每一个站点都有一个能量值,为了不让这些能量值连接起来,要用
坦克占领这个站点!已知站点的 之间的距离,每个坦克从0点出发到某一个站点,1 unit distance costs 1 unit oil!
最后占领的所有的站点的能量值之和为总能量值的一半还要多,问最少耗油多少! */ /*
思路:不同的坦克会占领不同的站点,耗油最少那就是路程最少,所以我们先将从 0点到其他各点的
最短距离求出来!也就是d[i]的值!然后我们又知道每一个站点的所具有的能量值!也就是w[i];
最后求出满足占领站点的能量比总能量的一半多并且路程最少。。。直接01背包走起!
*/
#include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#define N 10005
#define INF 0x3f3f3f3f
using namespace std; int w[]; struct EDGE{
int u, v, nt, dist;
EDGE(){} EDGE(int u, int v, int nt, int dist){
this->u=u;
this->v=v;
this->nt=nt;
this->dist=dist;
}
}; EDGE edge[N*];
int first[];
int cnt;
queue<pair<int, int> >q;
int n, m;
int dp[];
int d[];
int map[][]; void addEdge(int u, int v, int dist){
edge[cnt++]=EDGE(u, v, first[u], dist);
first[u]=cnt-;
edge[cnt++]=EDGE(v, u, first[v], dist);
first[v]=cnt-;
} void Dijkstra(){
d[]=;
q.push(make_pair(, ));
while(!q.empty()){
pair<int,int> cur=q.front();
q.pop();
int u=cur.second;
if(d[u] != cur.first) continue;
for(int e=first[u]; e!=-; e=edge[e].nt){
int v=edge[e].v, dist=edge[e].dist;
if(d[v] > d[u] + dist){
d[v] = d[u] + dist;
q.push(make_pair(d[v], v));
}
}
}
} int main(){
int t;
int sumP, sumD;
scanf("%d", &t);
while(t--){
scanf("%d%d", &n, &m);
cnt=;
memset(d, 0x3f, sizeof(d));
memset(first, -, sizeof(first));
for(int i=; i<=n; ++i)
for(int j=; j<=n; ++j)
map[i][j]=INF;
while(m--){
int u, v, dist;
scanf("%d%d%d", &u, &v, &dist);
if(map[u][v]>dist)
map[u][v]=map[v][u]=dist;
}
for(int i=; i<=n; ++i)
for(int j=; j<=i; ++j)
if(map[i][j]!=INF)
addEdge(i, j, map[i][j]);
Dijkstra();//求出 0点到其他个点的最短的距离!
sumP=sumD=;
for(int i=; i<=n; ++i){
scanf("%d", &w[i]);
sumP+=w[i];
sumD+=d[i];
}
memset(dp, 0x3f, sizeof(dp));//初始背包的总价值为无穷大
dp[]=; //zeroOnePackage... d[i]相当于价值(也就是耗油量), w[i]相当于容积(也就是能量值)
for(int i=; i<=n; ++i)
for(int j=sumP; j>=w[i]; --j)
dp[j]=min(dp[j], dp[j-w[i]]+d[i]); int maxCost=INF;
for(int i=sumP/+; i<=sumP; ++i)//注意是sumP/2+1(因为要比一半多)
if(maxCost>dp[i])
maxCost=dp[i];
if(maxCost==INF)
printf("impossible\n");
else printf("%d\n", maxCost);
}
return ;
}
/*
思路:dp[i][j]表示到达 i站点, 并且占领的能量值为 j时的耗油最小值!
开始想用的是spfa算法,并且在进行节点之间距离松弛的时候,也将 背包融进来,但是超时啊!
好桑心.....
*/ #include<iostream>
#include<queue>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#define N 10005
#define INF 0x3f3f3f3f
using namespace std; int w[]; struct EDGE{
int u, v, nt, dist;
EDGE(){} EDGE(int u, int v, int nt, int dist){
this->u=u;
this->v=v;
this->nt=nt;
this->dist=dist;
}
}; EDGE edge[N*];
int first[];
int cnt;
queue<pair<int, int> >q;
int vis[];
int n, m, sum;
int dp[][];
int map[][]; void addEdge(int u, int v, int dist){
edge[cnt++]=EDGE(u, v, first[u], dist);
first[u]=cnt-;
edge[cnt++]=EDGE(v, u, first[v], dist);
first[v]=cnt-;
} void spfa(){
dp[][]=;
q.push(make_pair(, ));
vis[]=;
while(!q.empty()){
pair<int,int> cur=q.front();
q.pop();
int u=cur.second;
vis[u]=;
for(int e=first[u]; e!=-; e=edge[e].nt){
int v=edge[e].v, dist=edge[e].dist;
for(int j=w[v]; j<=sum; ++j)
if(dp[v][j] > dp[u][j-w[v]] + dist){
dp[v][j] = dp[u][j-w[v]] + dist;
if(!vis[v]){
vis[v]=;
q.push(make_pair(dp[v][j], v));
}
}
}
}
} int main(){
int t;
scanf("%d", &t);
while(t--){
scanf("%d%d", &n, &m);
cnt=;
memset(first, -, sizeof(first));
for(int i=; i<=n; ++i)
for(int j=; j<=n; ++j)
map[i][j]=INF;
while(m--){
int u, v, dist;
scanf("%d%d%d", &u, &v, &dist);
if(map[u][v]>dist)
map[u][v]=map[v][u]=dist;
}
for(int i=; i<=n; ++i)
for(int j=; j<=n; ++j)
if(map[i][j]!=INF)
addEdge(i, j, map[i][j]);
for(int i=; i<=n; ++i){//最后将1...n节点的最优值汇聚到 第 n+1个节点上
edge[cnt++]=EDGE(i, n+, first[i], );
first[i]=cnt-;
}
sum=;
for(int i=; i<=n; ++i){
scanf("%d", &w[i]);
sum+=w[i];
}
w[n+]=;
for(int i=; i<n+; ++i)
for(int j=; j<sum+; ++j)
dp[i][j]=INF;
spfa();
int maxCost=INF;
for(int i=sum/+; i<=sum; ++i)
if(maxCost>dp[n+][i])
maxCost=dp[n+][i];
if(maxCost==INF)
printf("impossible\n");
else printf("%d\n", maxCost);
}
return ;
}
hdu3339 In Action(Dijkstra+01背包)的更多相关文章
- HDU-3339 IN ACTION(Dijkstra +01背包)
Since 1945, when the first nuclear bomb was exploded by the Manhattan Project team in the US, the ...
- nyoj 203 三国志 dijkstra+01背包
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=203 思路:先求点0到每个点的最短距离,dijkstra算法,然后就是01背包了 我奇怪的 ...
- In Action(SPFA+01背包)
In Action Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- Nyoj 三国志(dijkstra+01背包)
描述 <三国志>是一款很经典的经营策略类游戏.我们的小白同学是这款游戏的忠实玩家.现在他把游戏简化一下,地图上只有他一方势力,现在他只有一个城池,而他周边有一些无人占的空城,但是这些空城中 ...
- hdu 3339 In Action (最短路径+01背包)
In Action Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU3339 In Action 【最短路】+【01背包】
<题目链接> 题目大意: 给出一个0-n组成的图,1-n的点上分布着值为pow的电站,给出图的m条边以及距离,从0出发到n个点中的x个点的行走距离和最小(因为是每炸一个点派出一辆坦克),且 ...
- HDU 3339 In Action(迪杰斯特拉+01背包)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=3339 In Action Time Limit: 2000/1000 MS (Java/Others) ...
- *HDU3339 最短路+01背包
In Action Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU 3339 In Action 最短路+01背包
题目链接: 题目 In Action Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
随机推荐
- 对文本行按特定字段排序(前N个字符或后N个字符),TCPL 练习5-17
The C programming language 的关于文本行排序的问题有很多种要求的方式,在对每行的字段排序方面,最简单的是例如对前N个字符或者末位N个字符进行排序,更高一点的要求是,对特殊符号 ...
- ZABBIX冗余架构构筑(Centos6.4+pacemaker+corosync+drbd)
基本构成: 用pacemaker+corosync控制心跳和资源迁移 用drbd同步zabbix配置文件和mysql数据库 所有软件都用yum安装至默认路径 主机的drbd领域挂载至/drbd,备机不 ...
- 岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯
岁末年初3Q大战惊现高潮,360震撼推出Android "3Q" IM即时通讯 看过了QQ和360斗争的开端高潮,当然现在还不能说这场斗争已经结束,在我看来这次的事件未尝不是一个适 ...
- .NET Core 1.0-最简单的Hello world控制台程序
使用任意的文本编辑软件,新建两个文件 1.Program.cs using System; using System.Collections.Generic; using System.Linq; u ...
- [Asp.net 开发系列之SignalR篇]专题二:使用SignalR实现酷炫端对端聊天功能
一.引言 在前一篇文章已经详细介绍了SignalR了,并且简单介绍它在Asp.net MVC 和WPF中的应用.在上篇博文介绍的都是群发消息的实现,然而,对于SignalR是为了实时聊天而生的,自然少 ...
- 故障排查:是什么 导致了服务器端口telnet失败?
telnet命令的主要作用是与目标端口进行TCP连接(即完成TCP三次握手). 当服务端启动后,但是telnet其监听的端口,却失败了.或者,当服务端运行了一段时间后,突然其监听的端口telnet不通 ...
- ENode 2.0 - 整体架构介绍
前言 今天是个开心的日子,又是周末,可以轻轻松松的写写文章了.去年,我写了ENode 1.0版本,那时我也写了一个分析系列.经过了大半年的时间,我对第一个版本做了很多架构上的改进,最重要的就是让ENo ...
- Java虚拟机13:互斥同步、锁优化及synchronized和volatile
互斥同步 互斥同步(Mutual Exclusion & Synchronization)是常见的一种并发正确性保证手段.同步是指子啊多个线程并发访问共享数据时,保证共享数据在同一时刻只能被一 ...
- 设计模式之美:Behavioral Patterns(行为型模式)
行为型模式涉及到算法和对象间职责的分配. 行为模式不仅描述对象或类的模式,还描述它们之间的通信模式. 这些模式刻划了在运行时难以跟踪的复杂的控制流.它们将你的注意力从控制流转移到对象间的联系方式上来. ...
- SQL调优之降龙十八掌系列
降龙十八掌是金庸小说的武功,招式名称取自<周易>,丐帮的镇帮绝学. 数据库性能优化是一门博大精深的学问.是一个大课题.本系列算是对数据库性能优化的一个总结,算是为2013年 划下一个句号. ...