hdu3339 In Action

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define Max 0x3f3f3f3f
 4 int n,m,totalEle,miCost;
 5 bool vis[101];
 6 int map[101][101],dist[101];
 7 int d[10001],val[101];
 8 void init()//初始化读入数据 
 9 {
10     int i,j,a,b,w;
11     scanf("%d%d",&n,&m);
12     for(i=0;i<=n;++i)
13         for(j=0;j<=n;++j)
14             map[i][j]=map[j][i]=Max;
15     for(i=0;i<m;++i){
16         scanf("%d%d%d",&a,&b,&w);
17         if(map[a][b]>w)
18             map[a][b]=map[b][a]=w;
19     }
20     for(totalEle=0,i=1;i<=n;++i){
21         scanf("%d",&val[i]);
22         totalEle+=val[i];
23     }
24     memset(vis,0,sizeof(vis));
25     memset(d,0x3f,sizeof(d));//因为要求最小值,所以要赋很大的值 
26     for(i=0;i<=n;++i)
27         dist[i]=map[0][i];
28 }
29 void dijkstra()
30 {
31     int i,k,t,min;
32     for(vis[0]=k=1;k<=n;++k){//n+1个点,求0到其它点的最短路径 
33         for(min=Max,i=0;i<=n;++i){
34             if(!vis[i]&&min>dist[i]){
35                 min=dist[i];
36                 t=i;
37             }
38         }
39         vis[t]=1;
40         for(i=0;i<=n;++i){
41             if(!vis[i]&&dist[i]>min+map[t][i]){
42                 dist[i]=min+map[t][i];
43             }
44         }
45     }
46 }
47 int dp()
48 {
49     int i,j;
50     for(miCost=Max,d[0]=0,i=1;i<=n;++i){//滚动数组也挺好用的 
51         for(j=totalEle;j>=val[i];--j){//以总电量为背包的0-1背包,求消耗最少的油 
52             d[j]<?=d[j-val[i]]+dist[i];//取较小值 
53             if(j>totalEle/2&&miCost>d[j])//寻找符合条件的最小耗油量 
54                 miCost=d[j];
55         }
56     }
57 }
58 int main()
59 {
60     int T;
61     scanf("%d",&T);
62     while(T--){
63         init();
64         dijkstra();
65         dp();
66         if(miCost<Max) printf("%d\n",miCost);
67         else puts("impossible");
68     }
69     return 0;
70 }

//最短路径+dp

原文地址:https://www.cnblogs.com/shihuajie/p/2652668.html