PG Battle 第4問:旅
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import static java.lang.Math.*; | |
import java.io.BufferedReader; | |
import java.io.IOException; | |
import java.io.InputStream; | |
import java.io.InputStreamReader; | |
import java.io.OutputStream; | |
import java.io.PrintWriter; | |
import java.util.Arrays; | |
public class Main { | |
public static void main(String[] args) { | |
InputStream inputStream = System.in; | |
OutputStream outputStream = System.out; | |
InputReader in = new InputReader(inputStream); | |
PrintWriter out = new PrintWriter(outputStream); | |
TaskD solver = new TaskD(); | |
solver.solve(1, in, out); | |
out.close(); | |
} | |
static int INF = 1 << 30; | |
static long LINF = 1L << 55; | |
static int MOD = 1000000007; | |
static int[] mh4 = { 0, -1, 1, 0 }; | |
static int[] mw4 = { -1, 0, 0, 1 }; | |
static int[] mh8 = { -1, -1, -1, 0, 0, 1, 1, 1 }; | |
static int[] mw8 = { -1, 0, 1, -1, 1, -1, 0, 1 }; | |
static class TaskD { | |
public void solve(int testNumber, InputReader in, PrintWriter out) { | |
int n = in.nextInt(), m = in.nextInt(); | |
int[][] mat = new int[n][n]; | |
for (int i = 0; i < n; i++) { | |
Arrays.fill(mat[i], -1); | |
} | |
for (int i = 0; i < m; i++) { | |
int a = in.nextInt()-1, b = in.nextInt()-1, c = in.nextInt(); | |
mat[a][b] = c; | |
mat[b][a] = c; | |
} | |
long[][] dp = new long[1 << n][n]; | |
for (int bit = 0; bit < 1 << n; bit++) { | |
for (int i = 0; i < n; i++) { | |
for (int j = 0; j < n; j++) { | |
if ((bit >> i & 1) == 1 && (bit >> j & 1) == 0 && mat[i][j] != -1) { | |
dp[bit | 1 << j][j] = max(dp[bit | 1 << j][j], dp[bit][i] + mat[i][j]); | |
} | |
} | |
} | |
} | |
long ans = 0; | |
for (int i = 0; i < 1 << n; i++) { | |
for (int j = 0; j < n; j++) { | |
ans = max(ans, dp[i][j]); | |
} | |
} | |
out.println(ans); | |
} | |
} | |
// input library | |
static class InputReader { | |
private final BufferedReader in; | |
private static int pos; | |
private static int readLen; | |
private static final char[] buffer = new char[1024 * 8]; | |
private static char[] str = new char[500 * 8 * 2]; | |
private static boolean[] isDigit = new boolean[256]; | |
private static boolean[] isSpace = new boolean[256]; | |
private static boolean[] isLineSep = new boolean[256]; | |
static { | |
for (int i = 0; i < 10; i++) { | |
isDigit['0' + i] = true; | |
} | |
isDigit['-'] = true; | |
isSpace[' '] = isSpace['\r'] = isSpace['\n'] = isSpace['\t'] = true; | |
isLineSep['\r'] = isLineSep['\n'] = true; | |
} | |
public InputReader(InputStream is) { | |
in = new BufferedReader(new InputStreamReader(is)); | |
} | |
public int read() { | |
if (pos >= readLen) { | |
pos = 0; | |
try { | |
readLen = in.read(buffer); | |
} catch (IOException e) { | |
throw new RuntimeException(); | |
} | |
if (readLen <= 0) { | |
throw new InputReader.EndOfFileRuntimeException(); | |
} | |
} | |
return buffer[pos++]; | |
} | |
public int nextInt() { | |
int len = 0; | |
str[len++] = nextChar(); | |
len = reads(len, isSpace); | |
int i = 0; | |
int ret = 0; | |
if (str[0] == '-') { | |
i = 1; | |
} | |
for (; i < len; i++) | |
ret = ret * 10 + str[i] - '0'; | |
if (str[0] == '-') { | |
ret = -ret; | |
} | |
return ret; | |
} | |
public long nextLong() { | |
int len = 0; | |
str[len++] = nextChar(); | |
len = reads(len, isSpace); | |
int i = 0; | |
long ret = 0; | |
if (str[0] == '-') { | |
i = 1; | |
} | |
for (; i < len; i++) | |
ret = ret * 10 + str[i] - '0'; | |
if (str[0] == '-') { | |
ret = -ret; | |
} | |
return ret; | |
} | |
public char nextChar() { | |
while (true) { | |
final int c = read(); | |
if (!isSpace[c]) { | |
return (char) c; | |
} | |
} | |
} | |
public String nextString() { | |
return new String(nextChars()); | |
} | |
public char[] nextChars() { | |
int len = 0; | |
str[len++] = nextChar(); | |
len = reads(len, isSpace); | |
return Arrays.copyOf(str, len); | |
} | |
int reads(int len, boolean[] accept) { | |
try { | |
while (true) { | |
final int c = read(); | |
if (accept[c]) { | |
break; | |
} | |
if (str.length == len) { | |
char[] rep = new char[str.length * 3 / 2]; | |
System.arraycopy(str, 0, rep, 0, str.length); | |
str = rep; | |
} | |
str[len++] = (char) c; | |
} | |
} catch (InputReader.EndOfFileRuntimeException e) { | |
} | |
return len; | |
} | |
public int[] nextIntArray(final int n) { | |
final int[] res = new int[n]; | |
for (int i = 0; i < n; i++) { | |
res[i] = nextInt(); | |
} | |
return res; | |
} | |
public int[] nextIntArray1Index(final int n) { | |
final int[] res = new int[n + 1]; | |
for (int i = 1; i < n + 1; i++) { | |
res[i] = nextInt(); | |
} | |
return res; | |
} | |
public int[] nextIntArrayDec(final int n) { | |
final int[] res = new int[n]; | |
for (int i = 0; i < n; i++) { | |
res[i] = nextInt() - 1; | |
} | |
return res; | |
} | |
public long[] nextLongArray(final int n) { | |
final long[] res = new long[n]; | |
for (int i = 0; i < n; i++) { | |
res[i] = nextLong(); | |
} | |
return res; | |
} | |
public long[] nextLongArray1Index(final int n) { | |
final long[] res = new long[n + 1]; | |
for (int i = 1; i < n + 1; i++) { | |
res[i] = nextLong(); | |
} | |
return res; | |
} | |
public long[] nextLongArrayDec(final int n) { | |
final long[] res = new long[n]; | |
for (int i = 0; i < n; i++) { | |
res[i] = nextLong() - 1; | |
} | |
return res; | |
} | |
public double nextDouble() { | |
return Double.parseDouble(nextString()); | |
} | |
public double[] nextDoubleArray(int n) { | |
double[] res = new double[n]; | |
for (int i = 0; i < n; i++) { | |
res[i] = nextDouble(); | |
} | |
return res; | |
} | |
static class EndOfFileRuntimeException extends RuntimeException { | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment