30pts,Java可能无法通过此题
查看原帖
30pts,Java可能无法通过此题
1280322
Monte_Cristo楼主2024/3/10 10:58

似乎由于栈深度的限制,Java用递归的tarjan来做此题会导致栈溢出,至少目前还没看到Java通过的提交记录,当然本蒟蒻也不清楚具体是为什么,如果有大佬ac了轻喷

import java.util.*;
import java.io.*;

public class Main {
    static StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));

    static int in() throws IOException {
        st.nextToken();
        return (int) st.nval;
    }

    static double nextDouble() throws IOException {
        st.nextToken();
        return st.nval;
    }

    static final int N = 80010;
    static final int M = 200050;
    static int n, m, t, cnt, tot, T, s, ans;
    static int[] head = new int[N];
    static int[] dfn = new int[N];
    static int[] low = new int[N];
    static int[] vis = new int[N];
    static int[] col = new int[N];
    static int[] H = new int[N];
    static int[] sum = new int[N];
    static int[] dis = new int[N];
    static int[] V = new int[N];
    static edge[] e = new edge[M];
    static edge[] E = new edge[M];
    static Stack<Integer> stack = new Stack<>();
    static Queue<Integer> q = new LinkedList<>();

    static class edge {
        int from, to, next, val, k;

        public edge(int from, int to, int next, int val, int k) {
            this.from = from;
            this.to = to;
            this.next = next;
            this.val = val;
            this.k = k;
        }
    }

    static void addedge(int u, int v, int w, int k) {
        e[++t] = new edge(u, v, head[u], w, k);
        head[u] = t;
    }

    static void add(int u, int v, int w) {
        E[++T] = new edge(u, v, H[u], w, 0);
        H[u] = T;
    }

    static void tarjan(int u) {
        dfn[u] = low[u] = ++cnt;
        vis[u] = 1;
        stack.push(u);
        for (int i = head[u]; i != 0; i = e[i].next) {
            int v = e[i].to;
            if (dfn[v] == 0) {
                tarjan(v);
                low[u] = Math.min(low[u], low[v]);
            } else if (vis[v] != 0) {
                low[u] = Math.min(low[u], dfn[v]);
            }
        }
        if (dfn[u] == low[u]) {
            tot++;
            int v;
            do {
                v = stack.pop();
                col[v] = tot;
                vis[v] = 0;
            } while (v != u);
        }
    }

    static void spfa(int s) {
        Arrays.fill(dis, -1);
        Arrays.fill(V, 0);
        dis[s] = sum[s];
        V[s] = 1;
        q.add(s);
        while (!q.isEmpty()) {
            int u = q.poll();
            V[u] = 0;
            for (int i = H[u]; i != 0; i = E[i].next) {
                int v = E[i].to;
                int w = E[i].val;
                if (dis[v] < dis[u] + w + sum[v]) {
                    dis[v] = dis[u] + w + sum[v];
                    if (V[v] == 0) {
                        V[v] = 1;
                        q.add(v);
                    }
                }
            }
        }
    }

    public static void main(String[] args) throws IOException {
        n = in();
        m = in();
        for (int i = 1; i <= m; i++) {
            int x = in();
            int y = in();
            int z = in();
            double k = nextDouble();
            addedge(x, y, z, (int) (k * 10));
        }
        for (int i = 1; i <= n; i++) {
            if (dfn[i] == 0) {
                tarjan(i);
            }
        }
        for (int i = 1; i <= m; i++) {
            int x = e[i].from;
            int y = e[i].to;
            int z = e[i].val;
            int k = e[i].k;
            if (col[x] == col[y]) {
                while (z > 0) {
                    sum[col[x]] += z;
                    z = z * k / 10;
                }
            } else {
                add(col[x], col[y], z);
            }
        }
        s = in();
        s = col[s];
        spfa(s);
        for (int i = 1; i <= tot; i++) {
            ans = Math.max(ans, dis[i]);
        }
        out.println(ans);
        out.close();
    }
}
2024/3/10 10:58
加载中...