Problem:
Escape

頂点に正の値を持つ無向グラフが与えられる。
頂点には 1 から N の番号がついており、i 番目の頂点は w_i の値を持っている。
1 番目の頂点からスタートし、直前に通った辺を通ることができないという制約のもとでグラフ上を移動することができる。
各頂点では，初めて訪れた時に限りその頂点が持つ値の点数を得られる。

取得できる点数の総和の最大値を求めよ。

Constraints

1 ≤ N ≤ 100000

N − 1 ≤ M ≤ 100000

1 ≤ w_i ≤ 1000

1 ≤ u_i, v_i ≤ N

多重辺・自己辺は存在しない

グラフは連結である

Input Format

入力は以下の形式で標準入力から与えられる。

N M
w_1 w_2 ... w_N
u_1 v_1
u_2 v_2
...
u_M v_M

1 行目にはグラフの頂点数 N と辺の数を表す整数 M が入力される。

2 行目には各頂点が持つ値 w_i が入力される。

さらに続けて M 行に、各辺により繋がれる 2 頂点の番号が入力される。

Output Format

答えを1行に出力せよ。

Sample Input 1

6 6
1 2 3 4 5 6
1 2
2 3
3 4
1 4
4 5
5 6

Sample Output 1

21

頂点 1→2→3→4→5→6 と進むことで全ての頂点の点数を集めることができます。

Sample Input 2

7 8
1 3 3 5 2 2 3
1 2
2 3
3 1
1 4
1 7
1 5
1 6
5 6

Sample Output 2

16

頂点 1→2→3→1→5→6→1→4 と進むことで16点を集めることができます。

Solution in JAVA (judge verdict: Accepted)


import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

class Main {
	double[][] p = new double[2][6];

	void run() {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		long[] w = new long[n];
		for (int i = 0; i < n; ++i) {
			w[i] = sc.nextLong();
		}
		@SuppressWarnings("unchecked")
		ArrayList<Integer>[] g = new ArrayList[n];
		for (int i = 0; i < n; ++i)
			g[i] = new ArrayList<>();
		int[] deg = new int[n];
		for (int i = 0; i < m; ++i) {
			int u = sc.nextInt();
			int v = sc.nextInt();
			--u;
			--v;
			g[u].add(v);
			g[v].add(u);
			++deg[u];
			++deg[v];
		}

		long[] f = new long[n];

		ArrayDeque<Integer> dq = new ArrayDeque<>();
		for (int i = 0; i < n; ++i) {
			if (deg[i] == 1 && i != 0) {
				dq.add(i);
			}
		}

		while (!dq.isEmpty()) {
			int v = dq.pollFirst();
			if (deg[v] == 0)
				throw new AssertionError();
			for (int dst : g[v]) {
				if (deg[dst] == 0)
					continue;
				f[dst] = Math.max(f[dst], f[v] + w[v]);
				--deg[dst];
				--deg[v];
				if (dst != 0 && deg[dst] == 1) {
					dq.addLast(dst);
				}
			}
		}

		long ans = 0;
		for (int i = 0; i < n; ++i) {
			if (i == 0 || deg[i] > 0)
				ans += w[i];
		}
		Arrays.sort(f);
		ans += f[f.length - 1];
		System.out.println(ans);
	}

	void tr(Object... objects) {
		System.out.println(Arrays.deepToString(objects));
	}

	public static void main(String[] args) {
		new Main().run();
	}
}