HDU 3339 最短路+01背包
In Action
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5220 Accepted Submission(s): 1745

Since 1945, when the first nuclear bomb was exploded by the Manhattan Project team in the US, the number of nuclear weapons have soared across the globe.
Nowadays,the crazy boy in FZU named AekdyCoin possesses some nuclear weapons and wanna destroy our world. Fortunately, our mysterious spy-net has gotten his plan. Now, we need to stop it.
But the arduous task is obviously not easy. First of all, we know that the operating system of the nuclear weapon consists of some connected electric stations, which forms a huge and complex electric network. Every electric station has its power value. To start the nuclear weapon, it must cost half of the electric network's power. So first of all, we need to make more than half of the power diasbled. Our tanks are ready for our action in the base(ID is 0), and we must drive them on the road. As for a electric station, we control them if and only if our tanks stop there. 1 unit distance costs 1 unit oil. And we have enough tanks to use.
Now our commander wants to know the minimal oil cost in this action.
For each case, first line is the integer n(1<= n<= 100), m(1<= m<= 10000), specifying the number of the stations(the IDs are 1,2,3...n), and the number of the roads between the station(bi-direction).
Then m lines follow, each line is interger st(0<= st<= n), ed(0<= ed<= n), dis(0<= dis<= 100), specifying the start point, end point, and the distance between.
Then n lines follow, each line is a interger pow(1<= pow<= 100), specifying the electric station's power by ID order.
If not exist print "impossible"(without quotes).
2 3
0 2 9
2 1 3
1 0 2
1
3
2 1
2 1 3
1
3
impossible
题意:坦克从0点出发,去破坏每一个电站,每个坦克只能破坏一个电站,每个电站都有一定的电量,问至少破坏1/2的电量最少需要消耗多少油量。
题解:先求出从0点出发到每一个顶点的最短距离,然后把从0出发到每一个顶点的距离之和当作容量v,进行01背包。最后和电量的总和的1/2比较。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = ;
const int INF = 0x3f3f3f3f;
struct edge
{
int to,cost;
friend bool operator < (edge A,edge B)
{
return A.cost>B.cost;
}
};
int n,m;
int dp[maxn*maxn];
vector<edge> g[maxn];
bool done[maxn];
int d[maxn];
int v[maxn];
void dijkstra()
{
memset(done,false,sizeof(done));
memset(d,INF,sizeof(d));
d[] = ;
priority_queue<edge> q;
q.push((edge){,});
while(!q.empty())
{
edge cur = q.top();
q.pop();
int v = cur.to;
if(done[v]) continue;
done[v] = true;
for(int i = ; i<g[v].size(); i++)
{
cur = g[v][i];
if(d[cur.to]>d[v]+cur.cost)
{
d[cur.to] = d[v]+cur.cost;
q.push((edge){cur.to,d[cur.to]});
}
}
}
}
void solve()
{
scanf("%d %d",&n,&m);
int a,b,c;
for(int i = ; i<=m; i++)
{
scanf("%d %d %d",&a,&b,&c);
g[a].push_back((edge){b,c});
g[b].push_back((edge){a,c});
}
dijkstra();
double sum = ;
int count = ;
memset(dp,,sizeof(dp));
for(int i = ; i<=n; i++)
{
scanf("%d",&v[i]);
sum += v[i];
if(d[i]!=INF)
count += d[i];
}
for(int i = ; i<=n; i++)
{
for(int j = count; j>=d[i]; j--)
{
if(dp[j-d[i]]+v[i]>dp[j])
{
dp[j] = dp[j-d[i]]+v[i];
}
}
}
int flag = ;
for(int i = ; i<=count; i++)
{
if(dp[i]>sum/2.0)
{
printf("%d\n",i);
flag = ;
break;
}
}
if(flag == ) printf("impossible\n");
for(int i = ; i<=n; i++) g[i].clear();
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
solve();
}
return ;
}
HDU 3339 最短路+01背包的更多相关文章
- HDU 3339 In Action【最短路+01背包】
题目链接:[http://acm.hdu.edu.cn/showproblem.php?pid=3339] In Action Time Limit: 2000/1000 MS (Java/Other ...
- HDU 3339 In Action【最短路+01背包模板/主要是建模看谁是容量、价值】
Since 1945, when the first nuclear bomb was exploded by the Manhattan Project team in the US, the n ...
- HDU 3339 In Action 最短路+01背包
题目链接: 题目 In Action Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- *HDU3339 最短路+01背包
In Action Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- In Action(最短路+01背包)
In Action Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- HDU 2602 Bone Collector(01背包裸题)
Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDU 2546 饭卡(01背包裸题)
饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- HDU 2602 - Bone Collector - [01背包模板题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 Many years ago , in Teddy’s hometown there was a ...
- HDU 5234 Happy birthday 01背包
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5234 bc:http://bestcoder.hdu.edu.cn/contests/con ...
随机推荐
- servlet第2讲(下集)----创建servlet实例(继承GenericServlet)
- Mysql:输出到文件
mysql>tee /home/a.txt mysql>show processlist; mysql>exit tee命令能重定向输出,同时屏幕会同步显示.
- Linux raid信息 查看
Linux下查看软.硬raid信息的方法. 软件raid:只能通过Linux系统本身来查看 cat /proc/mdstat 可以看到raid级别,状态等信息. 硬件raid: 最佳的办法是通过已安装 ...
- Service的启动方式
Service的启动方式: 两种启动模式,一种是非绑定启动模式,另一种是绑定启动模式. 一.startservice方式启动 Intent intent = new Intent(this, Firs ...
- 不同版本的Api控件显示可能不同
同样的一个布局, compileSdkVersion 24(android7.0)和 compileSdkVersion 18(android4.3)得到的结果可能不一样: <FrameLayo ...
- 后台数据download成excel的方法(controller/action)
jsp页面端 <a href="/portal/server/importExec" title="Data Download"> <img ...
- php发送get、post请求获取内容的几种方法
方法1: 用file_get_contents 以get方式获取内容 <?php $url='http://www.domain.com/'; $html = file_get_contents ...
- js.map error
1. 问题: 1.1 通过bower install 的components 许多在运行的时候报404无法找到js.map文件, 如图: 2. 分析: 2.1 查看 ...
- Intersecting Lines POJ 1269
题目大意:给出两条直线,每个直线上的两点,求这两条直线的位置关系:共线,平行,或相交,相交输出交点. 题目思路:主要在于求交点 F0(X)=a0x+b0y+c0==0; F1(X)=a1x+b1y+c ...
- 【转】VC6.0打开或者添加工程文件崩溃的解决方法
很多学习编程的同学都遇到这样的问题,在Windows操作系统下使用Visual C++ 6.0编程时,如果点击菜单中的[打开]或者[添加],或者按快捷键,都会弹出下图的对话框,出现程序崩溃并退出的情况 ...