Submission #878392

#TimeUsernameProblemLanguageResultExecution timeMemory
878392manizareCities (BOI16_cities)C++14
15 / 100
6084 ms37496 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#define pb push_back
#define F first
#define S second 
#define all(a) a.begin(),a.end()
#define pii pair <int,int>
#define PII pair<pii , pii>
#define int long long
#define sz(v) (int)v.size()
using namespace std ;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int maxn = 1e5 + 10 , inf = 1e18 , mod = 998244353 ;
int cnt= 1,  id[maxn] , dis[100][maxn] ,mark[maxn]  , n , m , k , A[maxn] , B[maxn] ;
vector<pii> G[maxn]; 
void dij(int r){
	priority_queue <pii> pq ;
	if(id[r] !=0)return ;
	id[r] = cnt ;
	for(int i = 1 ;i <= n ;i++){
		dis[cnt][i] = inf ;
		mark[i] =0 ;
	}
	dis[cnt][r] = 0 ;
	pq.push({0 , r}) ;
	while(pq.size()){
		int v = pq.top().S ; 
		pq.pop() ;
		if(mark[v] == 1)continue; 
		mark[v] = 1; 
		for(pii u : G[v]){
			if(dis[cnt][u.F] > dis[cnt][v]+u.S){
				dis[cnt][u.F] = dis[cnt][v] + u.S ;
				pq.push({-dis[cnt][u.F]  , u.F}) ;
			}
		}
	}
	cnt++;
}

int sl2(vector <int> a){
	return dis[id[a[0]]][a[1]] ;
}
int sl3(vector <int> a){
	int ans = inf ; 
	vector <int> vec ;
	for(int i =1 ; i <= n; i++){
		ans = min(ans , dis[id[a[0]]][i] + dis[id[a[1]]][i] + dis[id[a[2]]][i]);
	}
	return ans ;
}
vector <pair <pii ,int> > ed; 
int sl4(vector <int> a){
	for(int i = 1; i <= n; i++){
		A[i] = dis[id[a[0]]][i] + dis[id[a[1]]][i] ;
		B[i] = dis[id[a[2]]][i] + dis[id[a[3]]][i] ;
	}
	priority_queue<pii> pq ;
	for(int i = 1; i <= n; i++){
		pq.push({-A[i] , i}); 
		mark[i] =0 ; 
	}
	while(pq.size()){
		int v= pq.top().S ;
		pq.pop() ;
		if(mark[v] == 1)continue;
		mark[v] = 1; 
		for(pii u : G[v]){
			if(A[u.F] > A[v] + u.S){
				A[u.F] = A[v] + u.S; 
				pq.push({-A[u.F] , u.F}) ;
			}
		}
	}
	for(int i = 1; i <= n; i++){
		pq.push({-B[i] , i});
		mark[i] = 0;
	}
	while(pq.size()){
		int v= pq.top().S ;
		pq.pop() ;
		if(mark[v] == 1)continue;
		mark[v] = 1; 
		for(pii u : G[v]){
			if(B[u.F] > B[v] + u.S){
				B[u.F] = B[v] + u.S; 
				pq.push({-B[u.F] , u.F}) ;
			}
		}
	}
	int ans =inf ; 
	for(int i = 1 ; i<= n; i++){
		int sm =0 ;
		ans = min(ans , A[i] + B[i]) ;
		for(int x : a){
			sm += dis[id[x]][i];
		}
		ans = min(ans , sm );
	}
	return ans ;
}
int sl44(vector <int> vec){
		int ans = inf ;
		for(int i =0 ; i < 4 ; i++){
			vector <int> vec2 ;
			int f  =inf ;
			for(int x : vec){
				if(x!=vec[i]){
					vec2.pb(x);
					f = min(f , dis[id[vec[i]]][x]);
				}
			}
			ans = min(ans , f + sl3(vec2)) ;
		}
		ans = min(ans , sl4(vec)) ;
		swap(vec[1] , vec[2]) ;
		ans = min(ans , sl4(vec)) ;
		swap(vec[1] , vec[3]) ;
		ans = min(ans , sl4(vec)) ;
	return ans ; 
}
int sl5(vector <int> a){
	for(int i = 1; i <= n; i++){
		A[i] = dis[id[a[0]]][i] + dis[id[a[1]]][i] ;
		B[i] = dis[id[a[2]]][i] + dis[id[a[3]]][i] ;
	}
	priority_queue<pii> pq ;
	for(int i = 1; i <= n; i++){
		pq.push({-A[i] , i}); 
		mark[i] =0 ; 
	}
	while(pq.size()){
		int v= pq.top().S ;
		pq.pop() ;
		if(mark[v] == 1)continue;
		mark[v] = 1; 
		for(pii u : G[v]){
			if(A[u.F] > A[v] + u.S){
				A[u.F] = A[v] + u.S; 
				pq.push({-A[u.F] , u.F}) ;
			}
		}
	}
	for(int i = 1; i <= n; i++){
		pq.push({-B[i] , i});
		mark[i] = 0;
	}
	while(pq.size()){
		int v= pq.top().S ;
		pq.pop() ;
		if(mark[v] == 1)continue;
		mark[v] = 1; 
		for(pii u : G[v]){
			if(B[u.F] > B[v] + u.S){
				B[u.F] = B[v] + u.S; 
				pq.push({-B[u.F] , u.F}) ;
			}
		}
	}
	int ans =inf ; 
	for(int i = 1 ; i<= n; i++){
		int sm =0 ;
		ans = min(ans , A[i] + B[i] + dis[id[a[4]]][i]) ;
		for(int x : a){
			sm += dis[id[x]][i];
		}
		ans = min(ans , sm );
	}	
	for(int i =1 ; i <= n; i++){
		B[i] = dis[id[a[2]]][i] + dis[id[a[3]]][i] + dis[id[a[4]]][i];
		mark[i] =0 ;
		pq.push({-B[i] , i});
	}
	while(pq.size()){
		int v= pq.top().S ;
		pq.pop() ;
		if(mark[v] == 1)continue;
		mark[v] = 1; 
		for(pii u : G[v]){
			if(B[u.F] > B[v] + u.S){
				B[u.F] = B[v] + u.S; 
				pq.push({-B[u.F] , u.F}) ;
			}
		}
	}
	for(int i = 1; i <= n; i++){
		ans = min(ans , A[i] + B[i]);
	}
	return ans ;
}

signed main() {
    ios::sync_with_stdio(0); cin.tie(0);
	cin >> n>> k >> m ;
	int dd = 0;
	vector <int> vec; 
	for(int i =0 ; i < k ; i++){
		int f; 
		cin >> f ;vec.pb(f);
	}
	for(int i = 1; i <= m ;i++){
		int v, u  , c ;
		cin >> v >> u >> c ;
		ed.pb({{v,u} ,c});
		G[v].pb({u,c});
		G[u].pb({v,c}) ;
	}
	for(int x : vec)dij(x);vector <int> p ;
	for(int i =0 ; i < 5 ; i++)p.pb(i);
	int ans = inf ;
	for(int i =0 ; i < 5 ; i++){
		int f =0 ;
		for(int x : vec){
			if(x!=vec[i]){
				f = min(f , dis[id[vec[i]]][x]);
			}
		}
		ans = min(ans , sl44(vec) + f) ;
	}
	do{
		vector <int> vec2 ;
		for(int i =0 ; i < 5 ; i++){
			vec2.pb(vec[p[i]]) ;
		}
		ans = min(ans , sl5(vec2)) ;
	}while(next_permutation(all(p)));
	cout << ans << "\n" ;
}
/* 
 
 
*/

Compilation message (stderr)

cities.cpp: In function 'int main()':
cities.cpp:208:2: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
  208 |  for(int x : vec)dij(x);vector <int> p ;
      |  ^~~
cities.cpp:208:25: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
  208 |  for(int x : vec)dij(x);vector <int> p ;
      |                         ^~~~~~
cities.cpp:195:6: warning: unused variable 'dd' [-Wunused-variable]
  195 |  int dd = 0;
      |      ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...