# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
641074 |
2022-09-16T00:14:20 Z |
kith14 |
Cities (BOI16_cities) |
C++17 |
|
319 ms |
32448 KB |
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
#define pairll pair<ll,ll>
#define lpairll pair<ll,pairll>
#define repp(i,a,b) for (ll i = a; i <= b; i++)
#define repz(i,a,b) for (ll i = a; i < b; i++)
#define repm(i,a,b) for (ll i = a; i >= b; i--)
#define fr first
#define sc second
#define mp make_pair
#define pb push_back
const ll N = 1e5+5, MOD = 1e9+7, M = 2e5+5;
ll tc = 1, n, m, ar[N], used[25];
ll x, y, k, dis[N][5];
string s, s1, s2, ye = "YES", no = "NO";
vector<lpairll> ed[N];
vector<lpairll> V;
vector<ll> pk[5];
ll xr[M], wr[M], yr[M], pr[25];
void input(){
cin >> n >> k >> m;
repp(i,1,k) cin >> ar[i], used[ar[i]] = 1;
repp(i,1,m){
ll x, y, w;
cin >> xr[i] >> yr[i] >> wr[i];
x = xr[i], y = yr[i], w = wr[i];
ed[x].pb(mp(y,mp(w,i)));
ed[y].pb(mp(x,mp(w,i)));
V.pb(mp(w,mp(x,y)));
}
}
ll fir(ll i){
if (i == pr[i]) return i;
return pr[i] = fir(pr[i]);
}
bool merge(ll a, ll b){
a = fir(a), b = fir(b);
if (a == b) return 0;
pr[a] = b;
return 1;
}
void sub1(){
//create an mst with the nodes that are active
vector<ll> act;
repp(i,1,n){
if (!used[i]) act.pb(i);
}
ll sz = act.size(), ans = 4e18;
repp(i,0,(1<<sz)){
repz(j,0,sz){
if((1<<j)&i) used[act[j]] = 1;
else used[act[j]] = 0;
}
// cout << "i = " << i << endl;
// repp(j,1,n){
// cout << j << " " << used[j] << endl;
// }
ll cur = 0;
repp(j,1,n) pr[j] = j;
for (auto j : V){
ll w = j.fr, x = j.sc.fr, y = j.sc.sc;
if (!used[x] || !used[y]) continue;
if(merge(x,y)) cur += w;
}
// repp(j,1,n){
// cout << j << " " << fir(j) << endl;
// }
bool imp = 0;
repp(j,1,k){
imp |= (fir(ar[j]) != fir(ar[1]));
}
if (imp) continue;
ans = min(ans,cur);
}
cout << ans << endl;
}
void subk2(ll st, ll fn, ll cr){
repp(i,1,n) dis[i][cr] = 4e18;
dis[ar[st]][cr] = 0;
priority_queue<pairll,vector<pairll>,greater<pairll> > pq;
pq.push(mp(0,ar[st]));
while(pq.size()){
pairll a = pq.top();
pq.pop();
for (auto i : ed[a.sc]){
ll nxidx = i.fr, w = i.sc.fr;
if (dis[nxidx][cr] > dis[a.sc][cr]+w){
dis[nxidx][cr] = dis[a.sc][cr]+w;
pq.push(mp(dis[nxidx][cr],nxidx));
}
}
}
}
void subk3(){
subk2(1,2,1);
subk2(2,3,2);
subk2(3,1,3);
ll ans = 4e18;
repp(xex,1,n){
ll cur = 0;
repp(pep,1,3){
cur += dis[xex][pep];
}
ans = min(ans,cur);
}
cout << ans << endl;
}
void solve(){
if (n <= 20 && m <= 40){
sort(V.begin(),V.end());
sub1();
}
else if (k == 2){
subk2(1,2,1);
cout << dis[ar[2]][1] << endl;
}
else if (k == 3){
subk3();
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
//cin >> tc;
while(tc--){
input();
solve();
}
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
2644 KB |
Output is correct |
2 |
Correct |
78 ms |
2688 KB |
Output is correct |
3 |
Correct |
43 ms |
2688 KB |
Output is correct |
4 |
Correct |
27 ms |
2644 KB |
Output is correct |
5 |
Correct |
16 ms |
2644 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
319 ms |
32404 KB |
Output is correct |
2 |
Correct |
260 ms |
32448 KB |
Output is correct |
3 |
Correct |
124 ms |
17932 KB |
Output is correct |
4 |
Correct |
98 ms |
25500 KB |
Output is correct |
5 |
Correct |
173 ms |
32360 KB |
Output is correct |
6 |
Correct |
67 ms |
25632 KB |
Output is correct |
7 |
Correct |
2 ms |
3028 KB |
Output is correct |
8 |
Correct |
2 ms |
2900 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
2 ms |
2900 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
126 ms |
26508 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
134 ms |
26576 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |