# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
783997 | ZHIRDILBILDIZ | 사이버랜드 (APIO23_cyberland) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#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] ;
vector<pair<int, int>> v[N] ;
set<pair<double, int>> s ;
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}) ;
}
}
}
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(!arr[i])
s.insert({0, i}) ;
// us[i] = 0 ;
}
deikstra() ;
if(dist[h] == 1e18)
return -1 ;
else
return dist[h] ;
}
}
signed main()
{
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 ;
}