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]的值!然后我们又知道每一个站点的所具有的能量值!也就是w[i];
 11      最后求出满足占领站点的能量比总能量的一半多并且路程最少。。。直接01背包走起! 
 12 */ 
 13 #include<iostream>
 14 #include<queue>
 15 #include<cstring>
 16 #include<cstdio>
 17 #include<algorithm>
 18 #include<vector>
 19 #define N 10005
 20 #define INF 0x3f3f3f3f
 21 using namespace std;
 22 
 23 int w[105];
 24 
 25 struct EDGE{
 26    int u, v, nt, dist;
 27    EDGE(){}
 28    
 29    EDGE(int u, int v, int nt, int dist){
 30       this->u=u;
 31       this->v=v;
 32       this->nt=nt;
 33       this->dist=dist;
 34    }
 35 };
 36 
 37 EDGE edge[N*2];
 38 int first[105];
 39 int cnt;
 40 queue<pair<int, int> >q;
 41 int n, m;
 42 int dp[10005];
 43 int d[105];
 44 int map[105][105];
 45 
 46 void addEdge(int u, int v, int dist){
 47     edge[cnt++]=EDGE(u, v, first[u], dist);
 48     first[u]=cnt-1;
 49     edge[cnt++]=EDGE(v, u, first[v], dist);
 50     first[v]=cnt-1;
 51 }
 52 
 53 void Dijkstra(){
 54    d[0]=0;
 55    q.push(make_pair(0, 0)); 
 56    while(!q.empty()){
 57        pair<int,int> cur=q.front();
 58        q.pop();
 59        int u=cur.second;
 60        if(d[u] != cur.first) continue;
 61        for(int e=first[u]; e!=-1; e=edge[e].nt){
 62               int v=edge[e].v, dist=edge[e].dist;
 63               if(d[v] > d[u] + dist){
 64                  d[v] = d[u] + dist;
 65                  q.push(make_pair(d[v], v));
 66               }
 67        }
 68    }
 69 }
 70 
 71 int main(){
 72    int t;
 73    int sumP, sumD;
 74    scanf("%d", &t);
 75    while(t--){
 76       scanf("%d%d", &n, &m);
 77       cnt=0;
 78       memset(d, 0x3f, sizeof(d));
 79       memset(first, -1, sizeof(first));
 80       for(int i=0; i<=n; ++i)
 81          for(int j=0; j<=n; ++j)
 82             map[i][j]=INF;
 83       while(m--){
 84           int u, v, dist;
 85           scanf("%d%d%d", &u, &v, &dist);
 86           if(map[u][v]>dist)
 87               map[u][v]=map[v][u]=dist;
 88       }
 89       for(int i=0; i<=n; ++i)
 90          for(int j=0; j<=i; ++j)
 91             if(map[i][j]!=INF)
 92               addEdge(i, j, map[i][j]); 
 93       Dijkstra();//求出 0点到其他个点的最短的距离! 
 94       sumP=sumD=0;
 95       for(int i=1; i<=n; ++i){
 96          scanf("%d", &w[i]);
 97          sumP+=w[i];
 98          sumD+=d[i];
 99       }
100       memset(dp, 0x3f, sizeof(dp));//初始背包的总价值为无穷大 
101       dp[0]=0;
102       
103       //zeroOnePackage... d[i]相当于价值(也就是耗油量), w[i]相当于容积(也就是能量值) 
104       for(int i=1; i<=n; ++i) 
105          for(int j=sumP; j>=w[i]; --j)
106             dp[j]=min(dp[j], dp[j-w[i]]+d[i]);
107       
108       int maxCost=INF;
109       for(int i=sumP/2+1; i<=sumP; ++i)//注意是sumP/2+1(因为要比一半多) 
110             if(maxCost>dp[i])
111                maxCost=dp[i];
112       if(maxCost==INF)
113          printf("impossible\n");
114       else printf("%d\n", maxCost);
115    }
116    return 0;
117 }
118 
119 /* 120 思路:dp[i][j]表示到达 i站点, 并且占领的能量值为 j时的耗油最小值! 121 开始想用的是spfa算法,并且在进行节点之间距离松弛的时候,也将 背包融进来,但是超时啊! 122 好桑心..... 123 */ 124 125 #include<iostream> 126 #include<queue> 127 #include<cstring> 128 #include<cstdio> 129 #include<algorithm> 130 #include<vector> 131 #define N 10005 132 #define INF 0x3f3f3f3f 133 using namespace std; 134 135 int w[105]; 136 137 struct EDGE{ 138 int u, v, nt, dist; 139 EDGE(){} 140 141 EDGE(int u, int v, int nt, int dist){ 142 this->u=u; 143 this->v=v; 144 this->nt=nt; 145 this->dist=dist; 146 } 147 }; 148 149 EDGE edge[N*2]; 150 int first[105]; 151 int cnt; 152 queue<pair<int, int> >q; 153 int vis[105]; 154 int n, m, sum; 155 int dp[105][10005]; 156 int map[105][105]; 157 158 void addEdge(int u, int v, int dist){ 159 edge[cnt++]=EDGE(u, v, first[u], dist); 160 first[u]=cnt-1; 161 edge[cnt++]=EDGE(v, u, first[v], dist); 162 first[v]=cnt-1; 163 } 164 165 void spfa(){ 166 dp[0][0]=0; 167 q.push(make_pair(0, 0)); 168 vis[0]=1; 169 while(!q.empty()){ 170 pair<int,int> cur=q.front(); 171 q.pop(); 172 int u=cur.second; 173 vis[u]=0; 174 for(int e=first[u]; e!=-1; e=edge[e].nt){ 175 int v=edge[e].v, dist=edge[e].dist; 176 for(int j=w[v]; j<=sum; ++j) 177 if(dp[v][j] > dp[u][j-w[v]] + dist){ 178 dp[v][j] = dp[u][j-w[v]] + dist; 179 if(!vis[v]){ 180 vis[v]=1; 181 q.push(make_pair(dp[v][j], v)); 182 } 183 } 184 } 185 } 186 } 187 188 int main(){ 189 int t; 190 scanf("%d", &t); 191 while(t--){ 192 scanf("%d%d", &n, &m); 193 cnt=0; 194 memset(first, -1, sizeof(first)); 195 for(int i=0; i<=n; ++i) 196 for(int j=0; j<=n; ++j) 197 map[i][j]=INF; 198 while(m--){ 199 int u, v, dist; 200 scanf("%d%d%d", &u, &v, &dist); 201 if(map[u][v]>dist) 202 map[u][v]=map[v][u]=dist; 203 } 204 for(int i=0; i<=n; ++i) 205 for(int j=0; j<=n; ++j) 206 if(map[i][j]!=INF) 207 addEdge(i, j, map[i][j]); 208 for(int i=1; i<=n; ++i){//最后将1...n节点的最优值汇聚到 第 n+1个节点上 209 edge[cnt++]=EDGE(i, n+1, first[i], 0); 210 first[i]=cnt-1; 211 } 212 sum=0; 213 for(int i=1; i<=n; ++i){ 214 scanf("%d", &w[i]); 215 sum+=w[i]; 216 } 217 w[n+1]=0; 218 for(int i=0; i<n+2; ++i) 219 for(int j=0; j<sum+2; ++j) 220 dp[i][j]=INF; 221 spfa(); 222 int maxCost=INF; 223 for(int i=sum/2+1; i<=sum; ++i) 224 if(maxCost>dp[n+1][i]) 225 maxCost=dp[n+1][i]; 226 if(maxCost==INF) 227 printf("impossible\n"); 228 else printf("%d\n", maxCost); 229 } 230 return 0; 231 }

 

转载于:https://www.cnblogs.com/hujunzheng/p/3913288.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/531754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在手机上安装youget_you-get 安装和用法

Usage: you-get [OPTION]... [URL]...Startup options:-V | --version 版本信息-h | --help 帮助Dry-run options: (no actual downloading)-i | --info 列出所有可获取的视频信息-u | --url 打印URLs的提取出信息&#xff0c;真实链接地址--json 打印URLs的JSON格式Download o…

ZZUOJ1196: 单调数

1 /*2 注意的事项:是输出小于 10^n的正整数的个数哦&#xff01;开始的时候总比样例输出多一个数&#xff0c;3 纠结了好久&#xff0c;原来是 0加了进去了&#xff01;4 5 dpI[n][m]表示的是第n位添加数字m&#xff08;0....9&#xff09;的构成单调递增数个数 6 …

mac 爱普生打印机驱动_epson l360 mac版驱动下载-爱普生l360驱动Mac版最新版 - 极光下载站...

爱普生l360驱动苹果电脑版是专为mac用户所设计打造&#xff0c; 当你的电脑中安装了本驱动程序以后&#xff0c;就可以非常轻松的进行操作打印了&#xff0c;与该型号的打印机相匹配&#xff0c;将会带给你最流畅的打印体会&#xff01;爱普生l360打印机介绍--打印质量分辨率可…

mysql 生成 javabean_从MySQL快速生成JavaBean

SELECTCONCAT(/**\n*,COLUMN_COMMENT,\n*/\n), -- 注解CONCAT(Column(name ",column_name,")\n), -- JPA字段注解( -- 根据表定义的字段生成相应的 Java类型CASEdata_typeWHEN varcharTHEN private StringWHEN bigintTHEN private IntegerWHEN intTHEN private Inte…

poj2253 Frogger(最短路变型或者最小生成树)

1 /*2 题意&#xff1a;就是源点到终点有多条的路径&#xff0c;每一条路径中都有一段最大的距离&#xff01;3 求这些路径中最大距离的最小值&#xff01;4 5 Dijkstra, Floyd, spfa都是可以的&#xff01;只不过是将松弛的条件变一下就行了&#xff01;6 7 …

python包mdure_Python hashlib模块实例使用详解

这篇文章主要介绍了Python hashlib模块实例使用详解,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下hashlib模块主要的作用&#xff1a;加密保护消息安全&#xff0c;常用的加密算法如MD5&#xff0c;SHA1等。1、…

UVAoj 348 - Optimal Array Multiplication Sequence

1 /*2 题意&#xff1a;矩阵相乘的最少的步数3 dp[i][j]min(dp[i][j], dp[i][k]dp[k1][j]num[i-1]*num[k]*num[j]);4 表示的是第i个矩阵到第j个矩阵相乘的最少步数5 sign[i][j]表示的是第i个矩阵到第j个矩阵相乘的最少步数是由第i个矩阵到第sign[i][j]个矩阵相…

raft协议 MySQL 切换_Raft 协议实战系列(二)—— 选主

注&#xff1a;本文原创&#xff0c;转载请标明出处。欢迎转发、关注微信公众号&#xff1a;Q的博客。 不定期发送干货&#xff0c;实践经验、系统总结、源码解读、技术原理。本文目的笔者期望通过系列文章帮助读者深入理解Raft协议并能付诸于工程实践中&#xff0c;同时解读不…

codeforce Pashmak and Buses(dfs枚举)

1 /*2 题意&#xff1a;n个同学&#xff0c;k个车&#xff0c; 取旅游d天&#xff01;3 要求所有的学生没有两个或者两个以上的在同一辆车上共同带d天&#xff01; 输出可行的方案&#xff01;4 5 对于d行n列的矩阵&#xff0c;第i行第j列表示的是第i天第j个同学所…

怎样用mysql查询测试_如何测试数据库查询优化器

我一直认为&#xff0c;查询优化器(Query Optimizer&#xff0c;后面简称优化器)一直是数据库领域 Top 级别的 hardcore 技术&#xff0c;自己也一直尝试去深入理解&#xff0c;但每每看到 TiDB 代码里面那一大坨 plan 的代码&#xff0c;我就望而生畏了&#xff0c;就像是『可…

poj2060Taxi Cab Scheme(二分图匹配)

1 /*2 题意&#xff1a; 出租车 有一个出发的时间&#xff0c;从点&#xff08;a, b&#xff09;到点&#xff08;c, d&#xff09;&#xff0c;时间为3 abs(a-c)abs(b-d)! 一辆车可以在运完一个乘客后运另一个乘客, 4 条件是此车要在预约开始前一分钟之前到达出发地,…

二级java考什么_计算机二级Java考试资料!

Where领&#xff1f;基本要求1 . 掌握 Java 语言的特点&#xff64;实现机制和体系结构&#xff61;2 . 掌握 Java 语言中面向对象的特性&#xff61;3 . 掌握 Java 语言提供的数据类型和结构&#xff61;4 . 掌握 Java 语言编程的基本技术&#xff61;5 . 会编写 Java 用户界面…

二分匹配最大匹配的理解(附图解)

定义一个PXP的有向图中&#xff0c;路径覆盖就是在图中找一些路径&#xff0c;使之覆盖了图中的所有顶点&#xff0c;且任何一个顶点有且只有一条路径与之关联&#xff1b;&#xff08;如果把这些路径中的每条路径从它的起始点走到它的终点&#xff0c;那么恰好可以经过图中的每…

poj 2226 Muddy Fields(合理建图+二分匹配)

1 /*2 题意&#xff1a;用木板盖住泥泞的地方&#xff0c;不能盖住草。木板任意长&#xff01;可以重叠覆盖&#xff01; *表示泥泞的地方&#xff0c;.表示草&#xff01;3 思路&#xff1a;4 首先让我们回忆一下HDU 2119 Matrix这一道题&#xff0c;一个矩阵…

java验证码工具_java 验证码工具

importjavax.imageio.ImageIO;import java.awt.*;importjava.awt.image.BufferedImage;importjava.io.IOException;importjava.io.OutputStream;importjava.util.Random;public classCaptchaUtils {private final static Object lock newObject();/*** 图片的宽度。*/private …

Floyd算法的理解

转载于:https://www.cnblogs.com/hujunzheng/p/3919226.html

http get post java_java发送http的get、post请求实现代码

Http请求类package wzh.Http;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.URL;import java.net.URLConnection;import java.util.List;import java.util.Map;public class HttpRe…

java string的作用_浅谈java String不可变的好处

一、java内部String类的实现&#xff1a;java 8&#xff1a;public final class Stringimplements java.io.Serializable, Comparable, CharSequence {/** The value is used for character storage. */private final char value[];}java 9 及之后&#xff1a;(使用coder标识了…

34988 Happy Reversal(二进制去取反)

1 /*2 题意&#xff1a;给多个二进制数&#xff0c;对某些数进行按位取反操作&#xff01;3 然后从中找到最大数和最小数&#xff0c;并输出他们的差值&#xff01; 4 注意&#xff1a;所有的数都是整数&#xff0c;包括取反之后5 6 思路&#xff1a;一个n为二进…

java vim ide_Vim配置Java IDE

首先安装vim (当然做java 开发要装jdk 这个就不说了)emerge -av vim (gentoo 系统上安装vim 的命令,你可以用rpm ,apt-get )给vim 安装 javacomplete 插件http://www.vim.org/scripts/script.php?script_id1785 这个插件的作用是实现一部分代码提示功能 比如你输入 System…