#include<bits/stdc++.h>
//#include "cyberland.h"
#define ll long long
#define fi first
#define se second
using namespace std ;
const int N = 1e5 ;
bool us[N] ;
double dist[N], ds[3][31] ;
vector<int> abu ;
vector<pair<int, int>> v[N] ;
set<pair<double, int>> s ;
set<pair<pair<double, int>, int>> pq ;
void deikstra()
{
for(int i = 0 ; i < N ; i++)
dist[i] = 1e18 ;
for(auto i : s)
dist[i.se] = 0 ;
while(s.size())
{
pair<double, int> p = *s.begin() ;
s.erase(s.begin()) ;
if(us[p.se])
continue ;
us[p.se] = 1 ;
for(auto i : v[p.se])
{
if(us[i.fi] || dist[i.fi] <= p.fi + i.se)
continue ;
dist[i.fi] = p.fi + i.se ;
s.insert({dist[i.fi], i.fi}) ;
}
}
}
void for_more_point(int n, int k)
{
for(int i = 0 ; i < n ; i++)
for(int j = 0 ; j <= k ; j++)
ds[i][j] = 1e18 ;
ds[0][k] = 0 ;
pq.insert({{0, 0}, k}) ;
while(pq.size())
{
auto p = *pq.begin() ;
double dis = p.fi.fi ;
int city = p.fi.se, kn = p.se ;
pq.erase(pq.begin()) ;
if(us[city])
continue ;
for(auto i : v[city])
{
if(dis + i.se < ds[i.fi][kn])
{
ds[i.fi][kn] = dis + i.se ;
pq.insert({{ds[i.fi][kn], i.fi}, kn}) ;
}
if(kn && !abu[i.fi] && ds[i.fi][kn - 1])
{
ds[i.fi][kn - 1] = 0 ;
pq.insert({{0, i.fi}, kn - 1}) ;
}
if(kn && abu[i.fi] == 2 && ds[i.fi][kn - 1] >= (dis + i.se) / 2)
{
ds[i.fi][kn - 1] = (dis + i.se) / 2 ;
pq.insert({{ds[i.fi][kn - 1], i.fi}, kn - 1}) ;
}
}
}
}
double solve(int n, int m, int k, int h, vector<int> x, vector<int> y, vector<int> c, vector<int> arr)
{
bool flag1 = 0, flag2 = 0 ;
s.clear() ;
for(int i = 0 ; i < n ; i++)
{
us[i] = 0 ;
dist[i] = 0 ;
v[i].clear() ;
if(arr[i] != 1)flag1 = 1 ;
if(arr[i] == 2)flag2 = 1 ;
}
for(int i = 0 ; i < m ; i++)
{
v[x[i]].push_back({y[i], c[i]}) ;
v[y[i]].push_back({x[i], c[i]}) ;
}
if(!flag1)
{
s.insert({0, 0}) ;
deikstra() ;
if(dist[h] == 1e18)
return -1 ;
else
return dist[h] ;
}
if(!flag2)
{
us[h] = 1 ;
s.insert({0, 0}) ;
deikstra() ;
for(int i = 0 ; i < n ; i++)
{
if(us[i] && !arr[i] || !i)
s.insert({0, i}) ;
us[i] = 0 ;
}
deikstra() ;
if(dist[h] == 1e18)
return -1 ;
else
return dist[h] ;
}
if(n <= 3)
{
abu = arr ;
us[h] = 1 ;
for_more_point(n, k) ;
double ans = 1e18 ;
for(int i = 0 ; i <= k ; i++)
ans = min(ans, ds[h][i]) ;
if(ans == 1e18)return -1 ;
else return ans ;
}
}
//signed main()
//{
// freopen("rsub4_01.in", "r", stdin) ;
// ios_base::sync_with_stdio( 0 ) ;
// cin.tie( 0 ) ;
// cout.tie( 0 ) ;
// int t ;
// cin >> t ;
// while(t--)
// {
// int n, m, k, h ;
// cin >> n >> m >> k >> h ;
// vector<int> a(m), b(m), c(m), arr(n) ;
// for(int i = 0 ; i < n ; i++)
// cin >> arr[i] ;
// for(int i = 0 ; i < m ; i++)
// cin >> a[i] >> b[i] >> c[i] ;
// cout << fixed << setprecision(9) << solve(n, m, k, h, a, b, c, arr) << '\n' ;
// }
// return 0 ;
//}
Compilation message
cyberland.cpp: In function 'double solve(int, int, int, int, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
cyberland.cpp:104:22: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
104 | if(us[i] && !arr[i] || !i)
cyberland.cpp:125:1: warning: control reaches end of non-void function [-Wreturn-type]
125 | }
| ^
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
347 ms |
3592 KB |
Correct. |
2 |
Correct |
452 ms |
3716 KB |
Correct. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
28 ms |
3540 KB |
Correct. |
2 |
Correct |
31 ms |
3544 KB |
Correct. |
3 |
Correct |
33 ms |
3560 KB |
Correct. |
4 |
Correct |
29 ms |
3560 KB |
Correct. |
5 |
Correct |
32 ms |
3552 KB |
Correct. |
6 |
Correct |
29 ms |
4216 KB |
Correct. |
7 |
Correct |
34 ms |
4208 KB |
Correct. |
8 |
Correct |
14 ms |
4820 KB |
Correct. |
9 |
Correct |
59 ms |
3496 KB |
Correct. |
10 |
Correct |
60 ms |
3488 KB |
Correct. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
41 ms |
3576 KB |
Correct. |
2 |
Correct |
38 ms |
3580 KB |
Correct. |
3 |
Correct |
39 ms |
3640 KB |
Correct. |
4 |
Correct |
107 ms |
3484 KB |
Correct. |
5 |
Correct |
98 ms |
3488 KB |
Correct. |
6 |
Correct |
8 ms |
4180 KB |
Correct. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
28 ms |
14792 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
34 ms |
3572 KB |
Correct. |
2 |
Correct |
25 ms |
3572 KB |
Correct. |
3 |
Correct |
25 ms |
3636 KB |
Correct. |
4 |
Correct |
24 ms |
4180 KB |
Correct. |
5 |
Correct |
50 ms |
3496 KB |
Correct. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
32 ms |
3612 KB |
Correct. |
2 |
Correct |
30 ms |
3580 KB |
Correct. |
3 |
Correct |
32 ms |
8628 KB |
Correct. |
4 |
Correct |
18 ms |
4220 KB |
Correct. |
5 |
Correct |
90 ms |
3412 KB |
Correct. |
6 |
Correct |
31 ms |
3596 KB |
Correct. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
601 ms |
4928 KB |
Correct. |
2 |
Correct |
70 ms |
5752 KB |
Correct. |
3 |
Runtime error |
107 ms |
21064 KB |
Execution killed with signal 11 |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Runtime error |
5 ms |
6940 KB |
Execution killed with signal 11 |
2 |
Halted |
0 ms |
0 KB |
- |