HDU 3339 In Action(01背包+Dijkstra算法)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3078 Accepted Submission(s): 980

22 30 2 92 1 31 0 2132 12 1 313
5impossible
思路: 01背包+Dijkstra算法
import java.io.*;import java.util.*;public class Main {int T, n, m, MAX = 50000, M = 105, sum = 0, sum1 = 0;int[][] map = new int[M][M];int[] dis = new int[MAX];boolean[] boo = new boolean[MAX];int[] pow = new int[MAX];int[] dp = new int[1000001];public static void main(String[] args) throws Exception{new Main().work();}void work() throws Exception{BufferedReader bu=new BufferedReader(new InputStreamReader(System.in));PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out),true);T = Integer.parseInt(bu.readLine());String str[];while (T-- != 0) {str=bu.readLine().split(" ");n = Integer.parseInt(str[0]);m = Integer.parseInt(str[1]);init();for (int i = 0; i < m; i++) {str=bu.readLine().split(" ");int a = Integer.parseInt(str[0]);int b = Integer.parseInt(str[1]);int c = Integer.parseInt(str[2]);if (map[a][b] >= c)map[a][b] = map[b][a] = c;}Arrays.fill(pow, 0); for (int i = 1; i <= n; i++) { pow[i] = Integer.parseInt(bu.readLine()); } dijstra(0); if(dis[1]==MAX){ pw.println("impossible"); continue; } int dsum=0; int psum=0; for(int i=1;i<=n;i++){ psum+=pow[i]; dsum+=dis[i]; } Arrays.fill(dp, 0); for (int i = 1; i <= n; i++) { for (int j = dsum; j >= dis[i]; j--) { dp[j] = Math.max(dp[j],dp[j - dis[i]] + pow[i]); } } psum=(psum>>1)+1; for(int i=1;i<=dsum;i++){ if(dp[i]>=psum){ pw.println(i); break; } } }}void init() {for (int i = 0; i <= n; i++) {for (int j = 0; j <= n; j++) {map[i][j] = MAX;}}}void dijstra(int v) {int k = 0;for (int i = 0; i <= n; i++) {boo[i] = false;dis[i] = map[v][i];}boo[v] = true;dis[v] = 0;for (int i = 0; i <= n; i++) {int min = MAX;for (int j = 0; j <= n; j++) {if (!boo[j] && dis[j] < min) {min = dis[j];k = j;}}if (min == MAX)break;boo[k] = true;sum1+=dis[k];for (int j = 0; j <= n; j++) {if (!boo[j] && dis[j] > dis[k] + map[k][j])dis[j] = dis[k] + map[k][j];}}}}