qwerty787788

Untitled

Apr 2nd, 2015
360
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.45 KB | None | 0 0
  1. import java.util.*;
  2. import java.io.*;
  3.  
  4. public class HH {
  5.     FastScanner in;
  6.     PrintWriter out;
  7.  
  8.     ArrayList<Integer> lens;
  9.  
  10.     int[][] flow, cap;
  11.  
  12.     void findMinCostPaths() {
  13.         int n = flow.length;
  14.         int[] h = new int[n];
  15.         Arrays.fill(h, 0);
  16.         final int[] d = new int[n];
  17.         int[] last = new int[n];
  18.         int st = 0, en = n - 1;
  19.         boolean[] was = new boolean[n];
  20.         while (true) {
  21.             Arrays.fill(d, Integer.MAX_VALUE);
  22.             Arrays.fill(last, -1);
  23.             Arrays.fill(was, false);
  24.             d[st] = 0;
  25.             while (true) {
  26.                 int v = -1;
  27.                 for (int i = 0; i < n; i++) {
  28.                     if (!was[i]) {
  29.                         if (d[i] != Integer.MAX_VALUE
  30.                                 && (v == -1 || d[v] > d[i])) {
  31.                             v = i;
  32.                         }
  33.                     }
  34.                 }
  35.                 if (v == -1) {
  36.                     break;
  37.                 }
  38.                 was[v] = true;
  39.                 for (int to = 0; to < n; to++) {
  40.                     if (was[to] || flow[v][to] == cap[v][to]) {
  41.                         continue;
  42.                     }
  43.                     int newCost = flow[v][to] < 0 ? -1 : 1;
  44.                     newCost += d[v] + h[v] - h[to];
  45.                     if (d[to] > newCost) {
  46.                         d[to] = newCost;
  47.                         last[to] = v;
  48.                     }
  49.                 }
  50.             }
  51.             if (d[en] == Integer.MAX_VALUE)
  52.                 break;
  53.             for (int i = 0; i < n; i++) {
  54.                 if (d[i] != Integer.MAX_VALUE)
  55.                     h[i] += d[i];
  56.             }
  57.             int v = en;
  58.             int len = 0;
  59.             int max = Integer.MAX_VALUE;
  60.             while (v != st) {
  61.                 int prev = last[v];
  62.                 max = Math.min(max, flow[prev][v] < 0 ? -flow[prev][v]
  63.                         : cap[prev][v] - flow[prev][v]);
  64.                 v = prev;
  65.             }
  66.             v = en;
  67.             while (v != st) {
  68.                 int prev = last[v];
  69.                 len += flow[prev][v] < 0 ? -1 : 1;
  70.                 flow[prev][v] += max;
  71.                 flow[v][prev] -= max;
  72.                 v = prev;
  73.             }
  74.             for (int i = 0; i < max; i++) {
  75.                 lens.add(len);
  76.             }
  77.         }
  78.     }
  79.  
  80.     public void solve() throws IOException {
  81.         int n = in.nextInt();
  82.         int k = in.nextInt();
  83.         lens = new ArrayList<Integer>();
  84.         flow = new int[n][n];
  85.         cap = new int[n][n];
  86.         for (int i = 0; i < k; i++) {
  87.             int a = in.nextInt() - 1, b = in.nextInt() - 1, c = in.nextInt();
  88.             cap[a][b] = cap[b][a] = c;
  89.         }
  90.         int t = in.nextInt();
  91.         long f = in.nextInt();
  92.         if (n == 1) {
  93.             out.println(0);
  94.             return;
  95.         }
  96.         findMinCostPaths();
  97.         // Collections.sort(lens);
  98.         int daysL = 0, daysR = t + n;
  99.         while (daysR - daysL > 1) {
  100.             int days = (daysL + daysR) / 2;
  101.             int dudes = t;
  102.             long money = 0;
  103.             for (int len : lens) {
  104.                 long toGo = Math.min(dudes, days - len + 1);
  105.                 if (toGo < 0)
  106.                     continue;
  107.                 money += toGo * len;
  108.                 dudes -= toGo;
  109.             }
  110.             if (money <= f && dudes == 0)
  111.                 daysR = days;
  112.             else
  113.                 daysL = days;
  114.         }
  115.         if (daysR == t + n)
  116.             daysR = -1;
  117.         out.println(daysR);
  118.     }
  119.  
  120.     public void run() {
  121.         try {
  122.             in = new FastScanner();
  123.             out = new PrintWriter(System.out);
  124.  
  125.             int tests = in.nextInt();
  126.             for (int i = 0; i < tests; i++)
  127.                 solve();
  128.  
  129.             out.close();
  130.         } catch (IOException e) {
  131.             e.printStackTrace();
  132.         }
  133.     }
  134.  
  135.     class FastScanner {
  136.         BufferedReader br;
  137.         StringTokenizer st;
  138.  
  139.         FastScanner() {
  140.             br = new BufferedReader(new InputStreamReader(System.in));
  141.         }
  142.  
  143.         String next() {
  144.             while (st == null || !st.hasMoreTokens()) {
  145.                 try {
  146.                     st = new StringTokenizer(br.readLine());
  147.                 } catch (IOException e) {
  148.                     e.printStackTrace();
  149.                 }
  150.             }
  151.             return st.nextToken();
  152.         }
  153.  
  154.         int nextInt() {
  155.             return Integer.parseInt(next());
  156.         }
  157.  
  158.         long nextLong() {
  159.             return Long.parseLong(next());
  160.         }
  161.  
  162.         double nextDouble() {
  163.             return Double.parseDouble(next());
  164.         }
  165.     }
  166.  
  167.     public static void main(String[] arg) {
  168.         new HH().run();
  169.     }
  170. }
Advertisement
Add Comment
Please, Sign In to add comment