HDU 3339 In Action(最短路+背包)题解
Posted kirinsb
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 3339 In Action(最短路+背包)题解相关的知识,希望对你有一定的参考价值。
思路:最短路求出到每个点的最小代价,然后01背包,求出某一代价所能拿到的最大价值,然后搜索最后结果。
代码:
#include<cstdio> #include<set> #include<cmath> #include<stack> #include<cstring> #include<string> #include<sstream> #include<iostream> #include<algorithm> #define ll long long using namespace std; const int maxn = 100+5; const int INF = 0x3f3f3f3f; int lowcost[maxn],cost[maxn][maxn]; int dp[10005],power[maxn]; bool vis[maxn]; int n,m; void Dijkstra(int st){ for(int i = 0;i <= n;i++){ lowcost[i] = cost[0][i]; vis[i] = false; } lowcost[st] = 0; for(int i = 0;i < n;i++){ int k = -1,MIN = INF; for(int j = 0;j <= n;j++){ if(!vis[j] && lowcost[j] < MIN){ MIN = lowcost[j]; k = j; } } if(k == -1) break; vis[k] = true; for(int j = 0;j <= n;j++){ if(!vis[j] && lowcost[j] > lowcost[k] + cost[k][j]){ lowcost[j] = lowcost[k] + cost[k][j]; } } } } int main(){ int T; scanf("%d",&T); while(T--){ memset(cost,INF,sizeof(cost)); scanf("%d%d",&n,&m); while(m--){ int u,v,w; scanf("%d%d%d",&u,&v,&w); cost[u][v] = cost[v][u] = min(cost[u][v],w); } for(int i = 1;i <= n;i++) scanf("%d",&power[i]); int st = 0; for(int i = 1;i <= n;i++){ st += power[i]; } st = st / 2 + 1; Dijkstra(0); int ALL = 0; for(int i = 1;i <= n;i++){ if(lowcost[i] != INF) ALL += lowcost[i]; } memset(dp,0,sizeof(dp)); for(int i = 1;i <= n;i++){ if(lowcost[i] == INF) continue; for(int j = ALL;j >= lowcost[i];j--){ dp[j] = max(dp[j],dp[j - lowcost[i]] + power[i]); } } int Min = -1; for(int i = 0;i <= ALL;i++){ if(dp[i] >= st){ Min = i; break; } } if(Min != -1) printf("%d ",Min); else printf("impossible "); } return 0; }
以上是关于HDU 3339 In Action(最短路+背包)题解的主要内容,如果未能解决你的问题,请参考以下文章
Mr. Panda and Crystal HDU - 6007 最短路+完全背包