Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.52 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. import java.math.BigInteger;
  4. import java.util.HashMap;
  5. import java.util.Iterator;
  6. import java.util.LinkedList;
  7.  
  8.  
  9. public class Main {
  10.  
  11.     LinkedList<Integer>[] adj;
  12.     long[] sigs;
  13.     long[] best;
  14.     boolean[] visited;
  15.     int e;
  16.     int t;
  17.     public void run() {
  18.         try {
  19.             BufferedReader buff = new BufferedReader(new InputStreamReader(System.in));
  20.             while (true) {
  21.                 String line = buff.readLine().trim();
  22.                 String[] toks = line.split("[ ]+");
  23.                 t = Integer.parseInt(toks[0]);
  24.                 e = Integer.parseInt(toks[1]);
  25.                 if (t == 0 && e == 0) {
  26.                     return;
  27.                 }
  28.                 adj = new LinkedList[e+t];
  29.                 sigs = new long[t+e];
  30.                 best = new long[e+t];
  31.                 visited = new boolean[e+t];
  32.                 for (int i = 0; i < adj.length; i++) {
  33.                     adj[i] = new LinkedList<Integer>();
  34.                 }
  35.                 for (int i = 0; i < t; i++) {
  36.                     line = buff.readLine().trim();
  37.                     toks = line.split("[ ]+");
  38.                     int bs = Integer.parseInt(toks[0]);
  39.                     int nd = Integer.parseInt(toks[1]);
  40.                     int ne = Integer.parseInt(toks[2]);
  41.                     sigs[i+e] = bs;
  42.                    
  43.                     line = buff.readLine().trim();
  44.                     toks = line.split("[ ]+");
  45.                    
  46.                     for (int j = 0; j < nd; j++) {
  47.                         int tmp = Integer.parseInt(toks[j]);
  48.                         adj[e+i].add(tmp-1+e);
  49.                     }
  50.                    
  51.                     for (int j = nd; j < nd+ne; j++) {
  52.                         int tmp = Integer.parseInt(toks[j]);
  53.                         adj[tmp-1].add(i+e);
  54.                     }
  55.                 }
  56.                 for (int i = 0; i < best.length; i++) {
  57.                     best[i] = -1;
  58.                     visited[i] = false;
  59.                 }
  60.                 depmap = new HashMap<Integer, BigInteger>();
  61.                 for (int i = 0; i < t; i++) {
  62.                     if (depmap.get(i+e) == null) {
  63.                         dfsDependency(i+e);
  64.                     }
  65.                 }
  66.                
  67.                 System.out.println("*****");
  68.                 for (int i = 0; i < t; i++) {
  69.                     if (best[i+e] == -1) {
  70.                         best[i+e] = dfs(i+e);
  71.                     }
  72. //                      long ret = dfs(i);
  73. //                      System.out.println((i+1) + " " + ret);
  74.                 }
  75.                
  76.                 for (int i = 0; i < e; i++) {
  77.                     long res = 0;
  78.                     Iterator<Integer> tasks = adj[i].iterator();
  79.                     while (tasks.hasNext()) {
  80.                         int task = tasks.next();
  81.                         if (valid(i, task)) {
  82.                             res += best[task];
  83.                         }
  84.                     }
  85. //                  for (int j = 0; j < t; j++) {
  86. //                      if (valid(i, j)) {
  87. //                          res += best[j+e];
  88. //                      }
  89. //                  }
  90.                     System.out.println((i+1) + " " + res);
  91.                 }
  92.                
  93.             }
  94.         } catch (Exception e) {
  95.             e.printStackTrace();
  96.         }
  97.     }
  98.  
  99.     public boolean valid(int emp, int task) {
  100.         Iterator<Integer> itr = adj[emp].iterator();
  101. //      task += e;
  102.         while (itr.hasNext()) {
  103.             int curr = itr.next();
  104.             if (curr == task) {
  105.                 continue;
  106.             }
  107.             BigInteger num = depmap.get(curr);
  108.             if (!num.and(new BigInteger("1").shiftLeft(task)).equals(BigInteger.ZERO)) {
  109.                 return false;
  110.             }
  111.         }
  112.         return true;
  113.     }
  114.    
  115.     HashMap<Integer, BigInteger> depmap;
  116.    
  117.     public BigInteger dfsDependency(int node) {
  118.         BigInteger res = new BigInteger("0");
  119.         Iterator<Integer> itr = adj[node].iterator();
  120.         while (itr.hasNext()) {
  121.             int ch = itr.next();
  122.             if (depmap.get(ch) == null) {
  123.                 depmap.put(ch, dfsDependency(ch));
  124.             }
  125.            
  126.             res = res.or(depmap.get(ch));
  127.             res = res.or(new BigInteger("1").shiftLeft(ch));
  128.         }
  129.         depmap.put(node, res);
  130.         return res;
  131.     }
  132.    
  133.     public long dfs(int n) {
  134.         long res = 0;
  135.         Iterator<Integer> itr = adj[n].iterator();
  136.         while (itr.hasNext()) {
  137.             int ch = itr.next();
  138.             if (best[ch] == -1) {
  139.                 best[ch] = dfs(ch);
  140.             }
  141.             res += best[ch];
  142.         }
  143.        
  144.         best[n] = res+sigs[n];
  145.         return best[n];
  146.     }
  147.    
  148.     public static void main(String[] args) {
  149.         new Main().run();
  150.     }
  151. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement