HDU 3339 In Action(最短路+背包)
链接:
http://acm.hdu.edu.cn/showproblem.php?pid=3339
题目:
Problem Description
22 30 2 92 1 31 0 2132 12 1 313
5impossible
#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<utility>using namespace std;typedef pair<int, int>pii;const int INF = 0x7fffffff;const int VN = 105;const int EN = 20005;struct Edge{int v,next,w;}E[EN];priority_queue<pii,vector<pii>,greater<pii> >q;int n, size;int head[VN], d[VN], pow[VN];int dp[10005];int oil[10005];void init(){ size = 0; memset(head, -1, sizeof(head)); while(!q.empty()) q.pop();}void addEdge(int u,int v,int w){ E[size].v=v, E[size].w=w; E[size].next = head[u]; head[u] = size++;}void Dijkstra(int src){ for(int i=0; i<=n; ++i) d[i] = INF; d[src] = 0; q.push(make_pair(d[src], src)); while(!q.empty()){ pii x = q.top(); q.pop(); int u = x.second; if(d[u] != x.first) continue; for(int e=head[u]; e!=-1; e=E[e].next){ int tmp = d[u] + E[e].w; if(d[E[e].v] > tmp){ d[E[e].v] = tmp; q.push(make_pair(tmp,E[e].v)); } } }} int main(){ int T,m,u,v,c; scanf("%d",&T); while(T--){ scanf("%d%d",&n,&m); init(); for(int i=0; i<m; ++i){ scanf("%d%d%d",&u,&v,&c); addEdge(u,v,c); addEdge(v,u,c); } for(int i=1; i<=n; ++i){ scanf("%d",&pow[i]); } Dijkstra(0); if(d[1]==INF){ puts("impossible"); continue; } int dis_sum = 0, pow_sum = 0; for(int i=1; i<=n; ++i){ dis_sum += d[i]; pow_sum += pow[i]; } memset(dp, 0, sizeof(dp)); for(int i=1; i<=n; ++i) for(int j=dis_sum; j>=d[i]; --j) dp[j] = max(dp[j],dp[j-d[i]]+pow[i]); pow_sum = (pow_sum>>1)+1; for(int i=1; i<=dis_sum; ++i){ if(dp[i]>=pow_sum){ printf("%d\n", i); break; } } } return 0;}—— 生命的意义,在于赋予它意义。
原创 http://blog.csdn.net/shuangde800 , By D_Double (转载请标明)