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