qwerty787788

Two chinese algo

Nov 18th, 2012
269
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.17 KB | None | 0 0
  1. import java.io.*;
  2. import java.util.*;
  3.  
  4. public class Chinese {
  5.     FastScanner in;
  6.     PrintWriter out;
  7.  
  8.     ArrayList<Integer>[] g;
  9.     ArrayList<Integer>[] gr;
  10.     ArrayList<Integer>[] gCost;
  11.     ArrayList<Integer>[] grCost;
  12.  
  13.     int n;
  14.     boolean[] was;
  15.     int[] min;
  16.     long ans = 0;
  17.  
  18.     void dfs(int v) {
  19.         was[v] = true;
  20.         for (int i = 0; i < g[v].size(); i++) {
  21.             int u = g[v].get(i);
  22.             if (!was[u] && min[u] >= gCost[v].get(i))
  23.                 dfs(u);
  24.         }
  25.     }
  26.  
  27.     boolean allVisited() {
  28.         for (int i = 0; i < n; i++)
  29.             if (!was[i])
  30.                 return false;
  31.         return true;
  32.     }
  33.  
  34.     ArrayList<Integer> order = new ArrayList<Integer>();
  35.     ArrayList<Integer> component = new ArrayList<Integer>();
  36.  
  37.     void dfs1(int v) {
  38.         was[v] = true;
  39.         for (int i = 0; i < g[v].size(); ++i)
  40.             if (!was[g[v].get(i)] && gCost[v].get(i) == min[g[v].get(i)])
  41.                 dfs1(g[v].get(i));
  42.         order.add(v);
  43.     }
  44.  
  45.     void dfs2(int v) {
  46.         was[v] = true;
  47.         component.add(v);
  48.         for (int i = 0; i < gr[v].size(); ++i)
  49.             if (!was[gr[v].get(i)] && grCost[v].get(i) == min[v])
  50.                 dfs2(gr[v].get(i));
  51.     }
  52.  
  53.     void solve() {
  54.         n = in.nextInt();
  55.         int m = in.nextInt();
  56.         was = new boolean[n];
  57.         g = new ArrayList[n];
  58.         gr = new ArrayList[n];
  59.         gCost = new ArrayList[n];
  60.         grCost = new ArrayList[n];
  61.         for (int i = 0; i < n; i++) {
  62.             g[i] = new ArrayList<Integer>();
  63.             gr[i] = new ArrayList<Integer>();
  64.             gCost[i] = new ArrayList<Integer>();
  65.             grCost[i] = new ArrayList<Integer>();
  66.         }
  67.         for (int i = 0; i < m; i++) {
  68.             int fr = in.nextInt() - 1;
  69.             int to = in.nextInt() - 1;
  70.             int cost = in.nextInt();
  71.             g[fr].add(to);
  72.             gr[to].add(fr);
  73.             gCost[fr].add(cost);
  74.             grCost[to].add(cost);
  75.         }
  76.         min = new int[n];
  77.         Arrays.fill(min, Integer.MAX_VALUE);
  78.         dfs(0);
  79.         if (!allVisited()) {
  80.             out.println("NO");
  81.             return;
  82.         }
  83.         int start = 0;
  84.         //int xx = 0;
  85.         while (true) {
  86.             //System.err.println(xx++);
  87.             int[] newMin = new int[n];
  88.             Arrays.fill(newMin, Integer.MAX_VALUE);
  89.             for (int i = 0; i < n; i++)
  90.                 for (int j = 0; j < g[i].size(); j++) {
  91.                     int u = g[i].get(j);
  92.                     if (u == start) continue;
  93.                     newMin[u] = Math.min(newMin[u], gCost[i].get(j));
  94.                 }
  95.             min = newMin;
  96.             for (int i = 0; i < n; i++)
  97.                 if (i != start)
  98.                     ans += min[i];
  99.             Arrays.fill(was, false);
  100.             dfs(start);
  101.             if (allVisited())
  102.                 break;
  103.             Arrays.fill(was, false);
  104.             order.clear();
  105.             for (int i = 0; i < n; ++i)
  106.                 if (!was[i])
  107.                     dfs1(i);
  108.             Arrays.fill(was, false);
  109.             int[] componentId = new int[n];
  110.             int components = 0;
  111.             for (int i = 0; i < n; ++i) {
  112.                 int v = order.get(n - 1 - i);
  113.                 if (!was[v]) {
  114.                     dfs2(v);
  115.                     for (int j : component)
  116.                         componentId[j] = components;
  117.                     component.clear();
  118.                     components++;
  119.                 }
  120.             }
  121.             //
  122.             int newN = components;
  123.             ArrayList<Integer>[] gNew = new ArrayList[newN];
  124.             ArrayList<Integer>[] grNew = new ArrayList[newN];
  125.             ArrayList<Integer>[] gCostNew = new ArrayList[newN];
  126.             ArrayList<Integer>[] grCostNew = new ArrayList[newN];
  127.             for (int i = 0; i < newN; i++) {
  128.                 gNew[i] = new ArrayList<Integer>();
  129.                 grNew[i] = new ArrayList<Integer>();
  130.                 gCostNew[i] = new ArrayList<Integer>();
  131.                 grCostNew[i] = new ArrayList<Integer>();
  132.             }
  133.             for (int i = 0; i < n; i++)
  134.                 for (int j = 0; j < g[i].size(); j++) {
  135.                     int u = g[i].get(j);
  136.                     int x = componentId[i];
  137.                     int y = componentId[u];
  138.                     if (x != y) {
  139.                         gNew[x].add(y);
  140.                         gCostNew[x].add(gCost[i].get(j) - min[u]);
  141.                         grNew[y].add(x);
  142.                         grCostNew[y].add(gCost[i].get(j) - min[u]);
  143.                     }
  144.                 }
  145.             n = newN;
  146.             g = gNew;
  147.             gr = grNew;
  148.             gCost = gCostNew;
  149.             grCost = grCostNew;
  150.             start = componentId[start];
  151.         }
  152.         out.println("YES");
  153.         out.println(ans);
  154.     }
  155.  
  156.     void run() {
  157.         try {
  158.             in = new FastScanner(new File("chinese.in"));
  159.             out = new PrintWriter(new File("chinese.out"));
  160.  
  161.             solve();
  162.  
  163.             out.close();
  164.         } catch (FileNotFoundException e) {
  165.             e.printStackTrace();
  166.         }
  167.     }
  168.  
  169.     void runIO() {
  170.  
  171.         in = new FastScanner(System.in);
  172.         out = new PrintWriter(System.out);
  173.  
  174.         solve();
  175.  
  176.         out.close();
  177.     }
  178.  
  179.     class FastScanner {
  180.         BufferedReader br;
  181.         StringTokenizer st;
  182.  
  183.         public FastScanner(File f) {
  184.             try {
  185.                 br = new BufferedReader(new FileReader(f));
  186.             } catch (FileNotFoundException e) {
  187.                 e.printStackTrace();
  188.             }
  189.         }
  190.  
  191.         public FastScanner(InputStream f) {
  192.             br = new BufferedReader(new InputStreamReader(f));
  193.         }
  194.  
  195.         String next() {
  196.             while (st == null || !st.hasMoreTokens()) {
  197.                 String s = null;
  198.                 try {
  199.                     s = br.readLine();
  200.                 } catch (IOException e) {
  201.                     e.printStackTrace();
  202.                 }
  203.                 if (s == null)
  204.                     return null;
  205.                 st = new StringTokenizer(s);
  206.             }
  207.             return st.nextToken();
  208.         }
  209.  
  210.         boolean hasMoreTokens() {
  211.             while (st == null || !st.hasMoreTokens()) {
  212.                 String s = null;
  213.                 try {
  214.                     s = br.readLine();
  215.                 } catch (IOException e) {
  216.                     e.printStackTrace();
  217.                 }
  218.                 if (s == null)
  219.                     return false;
  220.                 st = new StringTokenizer(s);
  221.             }
  222.             return true;
  223.         }
  224.  
  225.         int nextInt() {
  226.             return Integer.parseInt(next());
  227.         }
  228.  
  229.         long nextLong() {
  230.             return Long.parseLong(next());
  231.         }
  232.     }
  233.  
  234.     public static void main(String[] args) {
  235.         new Chinese().run();
  236.     }
  237. }
Advertisement
Add Comment
Please, Sign In to add comment