/**
____ ____ ____ ____ ____ ____
||l |||e |||i |||n |||a |||d ||
||__|||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|/__\|
**/
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
void speed()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
}
const int maxn = 1010;
const ll inf = 1e18;
int n, m, used[maxn];
ll d[maxn];
vector < int > g[maxn];
vector < ll > dp[maxn][3];
void to_process(int v, int u)
{
vector < ll > combine[3];
combine[0] = dp[v][0];
combine[1] = dp[v][1];
combine[2] = dp[v][2];
for (int i = 0; i <= n; i ++)
for (int j = 0; j <= n - i; j ++)
{
combine[0][i + j] = min(combine[0][i + j], dp[v][0][i] + min(dp[u][0][j], min(dp[u][1][j], dp[u][2][j])));
}
for (int i = 0; i <= n; i ++)
combine[1][i] = min(combine[1][i], combine[0][i] + d[v]);
for (int i = 0; i <= n; i ++)
for (int j = 0; j <= n - i; j ++)
{
combine[2][i + j + 2] = min(combine[2][i + j + 2], dp[v][1][i] + dp[u][1][j]);
combine[2][i + j + 1] = min(combine[2][i + j + 1], dp[v][1][i] + dp[u][2][j]);
combine[2][i + j] = min(combine[2][i + j], dp[v][2][i] + dp[u][2][j]);
//if (v == 1)
// cout << i << " " << j << " " << v << " " << u << " " << dp[v][2][i] << " " << dp[u][0][j] << endl;
combine[2][i + j + 1] = min(combine[2][i + j + 1], dp[v][2][i] + dp[u][1][j]);
combine[2][i + j] = min(combine[2][i + j], dp[v][2][i] + dp[u][0][j]);
}
//if (v == 1)
// cout << combine[2][5] << " ::: " << combine[2][6] << endl;
dp[v][0] = combine[0];
dp[v][1] = combine[1];
dp[v][2] = combine[2];
}
void dfs(int v)
{
///cout << "here " << v << endl;
dp[v][0].resize(n + 3, inf);
dp[v][1].resize(n + 3, inf);
dp[v][2].resize(n + 3, inf);
dp[v][0][0] = 0;
dp[v][1][0] = d[v];
used[v] = 1;
for (int u : g[v])
{
if (used[u])
continue;
dfs(u);
to_process(v, u);
}
}
void trav(int v)
{
used[v] = 1;
for (int u : g[v])
{
if (!used[u])
trav(u);
}
}
void solve()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++)
cin >> d[i];
for (int i = 1; i <= m; i ++)
{
int v, u;
cin >> v >> u;
g[v].push_back(u);
g[u].push_back(v);
}
vector < int > roots;
int root = 0;
for (int i = 1; i <= n; i ++)
{
if (!used[i])
{
trav(i);
g[root].push_back(i);
}
}
memset(used, 0, sizeof(used));
int ver = 0;
///cout << "dfs " << ver << endl;
dfs(0);
///cout << dp[1][2][3] << endl;
//for (int type = 0; type < 3; type ++, cout << endl)
//for (int j =0; j <= 10; j ++)
// cout << dp[ver][type][j] << " ";
//exit(0);
int q;
cin >> q;
for (int t = 0; t < q; t ++)
{
ll x;
cin >> x;
ll lf = 2, rf = n;
while(lf <= rf)
{
int mf = (lf + rf) / 2;
if (dp[root][0][mf] <= x)
lf = mf + 1;
else
rf = mf - 1;
}
if (rf < 2)
cout << 0 << endl;
else
cout << rf << endl;
}
}
int main()
{
speed();
solve();
return 0;
}
Compilation message
dzumbus.cpp: In function 'void solve()':
dzumbus.cpp:120:9: warning: unused variable 'ver' [-Wunused-variable]
120 | int ver = 0;
| ^~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1069 ms |
15924 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1069 ms |
15924 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
38 ms |
2704 KB |
Output is correct |
2 |
Correct |
35 ms |
2492 KB |
Output is correct |
3 |
Correct |
36 ms |
2904 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Execution timed out |
1069 ms |
15924 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |