In Action(最短路+01背包)

In Action

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4764    Accepted Submission(s): 1569

Problem Description


Since 1945, when the first nuclear bomb was exploded by the
Manhattan Project team in the US, the number of nuclear weapons have
soared across the globe.
Nowadays,the crazy boy in FZU named
AekdyCoin possesses some nuclear weapons and wanna destroy our world.
Fortunately, our mysterious spy-net has gotten his plan. Now, we need to
stop it.
But the arduous task is obviously not easy. First of
all, we know that the operating system of the nuclear weapon consists of
some connected electric stations, which forms a huge and complex
electric network. Every electric station has its power value. To start
the nuclear weapon, it must cost half of the electric network‘s power.
So first of all, we need to make more than half of the power diasbled.
Our tanks are ready for our action in the base(ID is 0), and we must
drive them on the road. As for a electric station, we control them if
and only if our tanks stop there. 1 unit distance costs 1 unit oil. And
we have enough tanks to use.
Now our commander wants to know the minimal oil cost in this action.

Input

The first line of the input contains a single integer T, specifying the number of testcase in the file.
For each case, first line is the integer n(1<= n<= 100),
m(1<= m<= 10000), specifying the number of the stations(the IDs
are 1,2,3...n), and the number of the roads between the
station(bi-direction).
Then m lines follow, each line is interger
st(0<= st<= n), ed(0<= ed<= n), dis(0<= dis<= 100),
specifying the start point, end point, and the distance between.
Then n lines follow, each line is a interger pow(1<= pow<= 100), specifying the electric station‘s power by ID order.

Output

The minimal oil cost in this action.
If not exist print "impossible"(without quotes).

Sample Input

2
2 3
0 2 9
2 1 3
1 0 2
1
3
2 1
2 1 3
1
3

题解:01背包+最短路;

代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 #define mem(x,y) memset(x,y,sizeof(x))
 8 const int INF=0x3f3f3f3f;
 9 const int MAXN=110;
10 const int MAXM=10010<<1;
11 struct Node{
12     int u,v,w;
13 };
14 Node dt[MAXM];
15 int edgnum,n;
16 int dis[MAXN];
17 int bag[10010];
18 int power[MAXN];
19 int add(int u,int v,int w){
20     dt[edgnum].u=u;dt[edgnum].v=v;dt[edgnum++].w=w;
21 }
22 void Bellman(){
23     mem(dis,INF);dis[0]=0;
24     for(int j=0;j<=n;j++){
25     for(int i=0;i<edgnum;i++){
26         int u=dt[i].u,v=dt[i].v,w=dt[i].w;
27         dis[v]=min(dis[v],dis[u]+w);
28         }
29     }
30 }
31 int main(){
32     int m,T;
33     scanf("%d",&T);
34     while(T--){
35         edgnum=0;
36         scanf("%d%d",&n,&m);
37         int u,v,w;
38         while(m--){
39             scanf("%d%d%d",&u,&v,&w);
40             add(u,v,w);add(v,u,w);
41         }
42         mem(bag,0);
43         int V=0,sum=0;
44         for(int i=1;i<=n;i++)scanf("%d",power+i),V+=power[i];
45         int flot=0;
46         Bellman();
47         for(int i=1;i<=n;i++){
48             if(dis[i]==INF){
49                 continue;
50             }
51             sum+=dis[i];
52         }
53         for(int i=1;i<=n;i++){
54             if(dis[i]!=INF)
55             for(int j=sum;j>=dis[i];j--){
56                 bag[j]=max(bag[j],bag[j-dis[i]]+power[i]);
57             }
58         }
59         int i;
60         for(i=0;i<sum;i++)if(bag[i]>V/2){//不能是(v+1)/2。。。
61             flot=1;
62             break;
63         }
64         if(flot)printf("%d\n",i);
65         else puts("impossible");
66     }
67     return 0;
68 }
时间: 2024-10-27 06:22:49

In Action(最短路+01背包)的相关文章

hdu3339 In Action 最短路+01背包

//有n个电站,每一个电站能提供不同的power, //所有tank从0点出发,停在该电站就代表摧毁了该电站,tank从电站到电站之间需要耗费能量 //现在有无穷的tank,问最少需要耗费多少油能够摧毁一半以上的power //先用dijkstra求得到每个点的dis[i] //然后用一个01背包得到答案 #include<cstdio> #include<cstring> #include<iostream> using namespace std ; const i

HDU 3339 In Action【最短路+01背包模板/主要是建模看谁是容量、价值】

 Since 1945, when the first nuclear bomb was exploded by the Manhattan Project team in the US, the number of nuclear weapons have soared across the globe. Nowadays,the crazy boy in FZU named AekdyCoin possesses some nuclear weapons and wanna destroy

hdu 3339(最短路+01背包)

In Action Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5135    Accepted Submission(s): 1710 Problem Description Since 1945, when the first nuclear bomb was exploded by the Manhattan Project t

hdu 3339 In Action (最短路径+01背包)

In Action Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3869    Accepted Submission(s): 1237 Problem Description Since 1945, when the first nuclear bomb was exploded by the Manhattan Project t

hdu 3339 In Action(迪杰斯特拉+01背包)

In Action Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5102    Accepted Submission(s): 1696 Problem Description Since 1945, when the first nuclear bomb was exploded by the Manhattan Project t

hdu3339 In Action(Dijkstra+01背包)

1 /* 2 题意:有 n 个站点(编号1...n),每一个站点都有一个能量值,为了不让这些能量值连接起来,要用 3 坦克占领这个站点!已知站点的 之间的距离,每个坦克从0点出发到某一个站点,1 unit distance costs 1 unit oil! 4 最后占领的所有的站点的能量值之和为总能量值的一半还要多,问最少耗油多少! 5 6 */ 7 8 /* 9 思路:不同的坦克会占领不同的站点,耗油最少那就是路程最少,所以我们先将从 0点到其他各点的 10 最短距离求出来!也就是d[i]的

HDU3339 In Action 【SPFA】+【01背包】

In Action Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4099    Accepted Submission(s): 1306 Problem Description Since 1945, when the first nuclear bomb was exploded by the Manhattan Project

nyoj 203 三国志(最短路加01背包)

三国志 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述 <三国志>是一款很经典的经营策略类游戏.我们的小白同学是这款游戏的忠实玩家.现在他把游戏简化一下,地图上只有他一方势力,现在他只有一个城池,而他周边有一些无人占的空城,但是这些空城中有很多不同数量的同种财宝.我们的小白同学虎视眈眈的看着这些城池中的财宝. 按照游戏的规则,他只要指派一名武将攻占这座城池,里面的财宝就归他所有了.不过一量攻占这座城池,我们的武将就要留守,不能撤回.因为我们的小白手下有无数的武将,

ZOJ1366经典dp(多重背包转01背包+优化空间)

1 //zoj1366类似背包的问题 2 //争取一遍AC 3 #include<iostream> 4 #include<string.h> 5 #include<stdio.h> 6 #define maxn 13 7 using namespace std; 8 9 int k[maxn]; 10 int n1[maxn]; 11 int c1[maxn]; 12 int c2[105]; 13 int dp[110000]; 14 int Cash,N1,N2;