
2 2 3 0 2 9 2 1 3 1 0 2 1 3 2 1 2 1 3 1 3
5 impossible
#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;
}原文地址:http://blog.csdn.net/guard_mine/article/details/41577045