HDU3339-In Action
http://acm.hdu.edu.cn/showproblem.php?pid=3339
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #define INF 900000000 #define Max 120 using namespace std; int dp[450000000],dis[10400],map[Max][Max],vis[Max],cost[Max]; void dijkstra(int n) { int i,j,k,min; for(i=0;i<=n;i++) { dis[i]=INF; vis[i]=0; } for(i=0;i<=n;i++) { if(map[0][i]<INF) dis[i]=map[0][i]; } vis[0]=1; dis[0]=0; for(i=0;i<n;i++) { min=INF; for(j=0;j<=n;j++) { if(!vis[j]&&min>dis[j]) { min=dis[j]; k=j; } } if(min==INF) break; vis[k]=1; for(j=0;j<=n;j++) if(!vis[j]&&dis[j]>map[k][j]+dis[k]) dis[j]=map[k][j]+dis[k]; } } int main(void) { int N,M,i,j,s,e,T,sum; scanf("%d",&T); while(T--) { scanf("%d%d",&N,&M); sum=0; for(i=0;i<=N;i++) for(j=0;j<=N;j++) { if(i==j) map[i][j]=0; else map[i][j]=INF; } for(i=0;i<M;i++) { scanf("%d%d%d",&s,&e,&j); map[s][e]=map[e][s]=(min(j,map[s][e])); } cost[0]=0; for(i=1;i<=N;i++) { scanf("%d",&cost[i]); sum+=cost[i]; } dijkstra(N); dp[0]=0; for(i=1;i<=sum+1;i++) dp[i]=INF; for(i=0;i<=N;i++) { for(j=sum;j>=cost[i];j--) { if(dp[j-cost[i]]<INF) dp[j]=min(dp[j],dp[j-cost[i]]+dis[i]); } } j=dp[sum+1]; for(i=sum;i>=sum/2+1;i--) if(j>dp[i]) j=dp[i]; if(j<INF) printf("%d\n",j); else printf("impossible\n"); } return 0; }