hdu3339——In Action

In Action

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 4256    Accepted Submission(s): 1372

Problem Description

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.

Input

The first line of the input contains a single integer T, specifying the number of testcase in the file.

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.

Output

The minimal oil cost in this action.

If not exist print "impossible"(without quotes).

Sample Input

2
2 3
0 2 9
2 1 3
1 0 2
1
3
2 1
2 1 3
1
3

Sample Output

5
impossible

Author

[email protected]

Source

HDOJ Monthly Contest – 2010.03.06

Recommend

先计算出0到其他的点距离,然后01背包

#include <map>
#include <set>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 110;
const int M = 10010;
const int inf = 0x3f3f3f3f;

struct node
{
	int weight;
	int next;
	int to;
}edge[M << 1];

struct node2
{
	int w;
	int c;
}num[N];

int tot, n, m;
int head[N];
int dis[N];
bool vis[N];
int dp[M * 10];

void addedge(int from, int to, int weight)
{
	edge[tot].weight = weight;
	edge[tot].next = head[from];
	edge[tot].to = to;
	head[from] = tot++;
}

void spfa(int v0)
{
	dis[v0] = 0;
	queue <int> qu;
	while (!qu.empty())
	{
		qu.pop();
	}
	qu.push(v0);
	while (!qu.empty())
	{
		int u = qu.front();
		qu.pop();
		for (int i = head[u]; ~i; i = edge[i].next)
		{
			int v = edge[i].to;
			if (dis[v] > dis[u] + edge[i].weight)
			{
				dis[v] = dis[u] + edge[i].weight;
				qu.push(v);
			}
		}
	}
}

int main()
{
	int t, u, v, w, ret, Vol;
	bool flag;
	scanf("%d", &t);
	while (t--)
	{
		memset (dis, inf, sizeof(dis));
		memset (head, -1, sizeof(head));
		memset (dp, 0, sizeof(dp));
		memset (vis, 0, sizeof(vis));
		tot = 0;
		scanf("%d%d", &n, &m);
		for (int i = 0; i < m; ++i)
		{
			scanf("%d%d%d", &u, &v, &w);
			addedge(u, v, w);
			addedge(v, u, w);
		}
		spfa(0);
		ret = Vol = 0;
		flag = true;
		for (int i = 1; i <= n; ++i)
		{
			scanf("%d", &num[i].w);
			ret += num[i].w;
			if (dis[i] != inf)
			{
				num[i].c = dis[i];
				Vol += num[i].c;
				vis[i] = 1;
			}
		}
		int ans = inf;
		// printf("%d\n", ret);
		ret = ret / 2 + 1;
		for (int i = 1; i <= n; ++i)
		{
			if (!vis[i])
			{
				continue;
			}
			for (int j = Vol; j >= num[i].c; --j)
			{
				dp[j] = max(dp[j], dp[j - num[i].c] + num[i].w);
				if (dp[j] >= ret)
				{
					ans = min(ans, j);
				}
			}
		}
		if (ans == inf)
		{
			printf("impossible\n");
		}
		else
		{
			printf("%d\n", ans);
		}
	}
	return 0;
}
时间: 2024-10-15 17:37:18

hdu3339——In Action的相关文章

hdu3339 In Action(Dijkstra+01背包)

1 /* 2 题意:有 n 个站点(编号1...n),每一个站点都有一个能量值,为了不让这些能量值连接起来,要用 3 坦克占领这个站点!已知站点的 之间的距离,每个坦克从0点出发到某一个站点,1 unit distance costs 1 unit oil! 4 最后占领的所有的站点的能量值之和为总能量值的一半还要多,问最少耗油多少! 5 6 */ 7 8 /* 9 思路:不同的坦克会占领不同的站点,耗油最少那就是路程最少,所以我们先将从 0点到其他各点的 10 最短距离求出来!也就是d[i]的

HDU3339 In Action 【SPFA】+【01背包】

In Action Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4099    Accepted Submission(s): 1306 Problem Description Since 1945, when the first nuclear bomb was exploded by the Manhattan Project

hdu3339 In Action 最短路+01背包

//有n个电站,每一个电站能提供不同的power, //所有tank从0点出发,停在该电站就代表摧毁了该电站,tank从电站到电站之间需要耗费能量 //现在有无穷的tank,问最少需要耗费多少油能够摧毁一半以上的power //先用dijkstra求得到每个点的dis[i] //然后用一个01背包得到答案 #include<cstdio> #include<cstring> #include<iostream> using namespace std ; const i

action

package com.ivchat.park.coupons.action; import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List; import javax.annotation.Resource; import net.sf.json.JSONObject; import org.apache.struts2.convention.an

【机器学习实战】Machine Learning in Action 代码 视频 项目案例

MachineLearning 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远 Machine Learning in Action (机器学习实战) | ApacheCN(apache中文网) 视频每周更新:如果你觉得有价值,请帮忙点 Star[后续组织学习活动:sklearn + tensorflow] ApacheCN - 学习机器学习群[629470233] 第一部分 分类 1.) 机器学习基础 2.) k-近邻算法 3.) 决策树 4.) 基于概率论的分类方法:朴素

wex5 教程 自定义action与名称去重

有一个订单,需要取出不同的客户名称,且只显示一次名称.效果如下图: 一 思路:自定义action,用sql语句的group by分组,将名称返回前端,用list显示出来. 二 制作步骤: 1 新建service service作为后端服务分发接口,一个工程可以有多个service,一个service可以有多个action. 2  新建action action基本参数: 名称:自定义 实现:(指向 java方法) 格式为 Name.getName   其中Name为java类,首写字母必须为大写

day8——ajax传参到action(Struts2)

第一种:url+?+参数 jsp中: $(function(){ $("[name='delemp']").click(function(){ $this = $(this); $delid = $this.attr("delid"); if(confirm("确认删除该条数据吗?")){ $.ajax({ type:"get", url:"deleteemployeebyid?delid="+$delid

Struts2系列笔记(3)---Action类的3种书写方式

Action类的3种书写方式 本文主要写有关写Action类的3种书写方式: (1)第一种 Action可以是POJO (简单模型对象)  不需要继承任何父类 也不需要实现任何接口 (2)实现Action接口 (3)继承ActionSupport(推荐) 那我们先来书写第一种: (1)第一种 Action可以是POJO (简单模型对象)  不需要继承任何父类 也不需要实现任何接口 1 //这里其实就是一个普通的类,类里面的方法可以任意写,如果写execute()方法那就代表默认执行它 2 pub

Func与Action

Func与Action C#委托的介绍(delegate.Action.Func.predicate) Func和Action委托的区别和简单使用