intmain() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d", &n); int now = 3, t = 4; while (0 != n % now) { now += t; t *= 2; } printf("%d\n", n / now); } return0; }
int T, n, m, a, b, c; ll p[N], sum[N]; int head[N], cnt, da[N], db[N], dc[N]; node edge[2 * N]; queue<int> q;
voidinit() { cnt = 0; for (int i = 1; i <= n; i++) head[i] = 0; for (int i = 1; i <= n; i++) da[i] = db[i] = dc[i] = INF; }
voidadd_edge(int u, int v) { edge[++cnt].to = v; edge[cnt].nex = head[u]; head[u] = cnt; }
voidbfs(int s, int *d) { while (!q.empty()) q.pop(); d[s] = 0; q.push(s); while (!q.empty()) { int u = q.front(); q.pop(); for (int i = head[u]; 0 != i; i = edge[i].nex) { int v = edge[i].to; if (d[v] != INF) continue; d[v] = d[u] + 1; q.push(v); } } }
intmain() { // freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); scanf("%d", &T); while (T--) { scanf("%d%d%d%d%d", &n, &m, &a, &b, &c); init(); for (int i = 1; i <= m; i++) scanf("%lld", &p[i]); sort(p + 1, p + m + 1); for (int i = 1; i <= m; i++) sum[i] = sum[i - 1] + p[i]; for (int i = 1; i <= m; i++) { int u, v; scanf("%d%d", &u, &v); add_edge(u, v); add_edge(v, u); } bfs(a, da); bfs(b, db); bfs(c, dc); ll res = 1000000000000000000; for (int i = 1; i <= n; i++) { if (da[i] + db[i] + dc[i] > m) continue; res = min(res, sum[db[i]] + sum[da[i] + db[i] + dc[i]]); } printf("%lld\n", res); } return0; }