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.pswp.cn/news/531754.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/531754.shtml
英文地址,請注明出處:http://en.pswp.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…