程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu3339¡ª¡ªIn Action

hdu3339¡ª¡ªIn Action

編輯:C++入門知識

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 wZ†·Ÿ"http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcmxkLiBGb3J0dW5hdGVseSwgb3VyIG15c3RlcmlvdXMgc3B5LW5ldCBoYXMgZ290dGVuIGhpcyBwbGFuLiBOb3csIHdlIG5lZWQgdG8gc3RvcCBpdC48YnI+CkJ1dCB0aGUgYXJkdW91cyB0YXNrIGlzIG9idmlvdXNseSBub3QgZWFzeS4gRmlyc3Qgb2YgYWxsLCB3ZSBrbm93IHRoYXQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb2YgdGhlIG51Y2xlYXIgd2VhcG9uIGNvbnNpc3RzIG9mIHNvbWUgY29ubmVjdGVkIGVsZWN0cmljIHN0YXRpb25zLCB3aGljaCBmb3JtcyBhIGh1Z2UgYW5kIGNvbXBsZXggZWxlY3RyaWMgbmV0d29yay4gRXZlcnkgZWxlY3RyaWMgc3RhdGlvbiBoYXMgaXRzIHBvd2VyIHZhbHVlLiBUbyBzdGFydAogdGhlIG51Y2xlYXIgd2VhcG9uLCBpdCBtdXN0IGNvc3QgaGFsZiBvZiB0aGUgZWxlY3RyaWMgbmV0d29yaw=="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 Lost@HDU
Source HDOJ Monthly Contest ¨C 2010.03.06
Recommend

ÏȼÆËã³ö0µ½ÆäËûµÄµã¾àÀ룬Ȼºó01±³°ü

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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  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;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved