제출 #491862

#제출 시각아이디문제언어결과실행 시간메모리
491862codr0Cities (BOI16_cities)C++14
74 / 100
6092 ms52672 KiB
// Code by Parsa Eslami #include <bits/stdc++.h> #define int long long #define FOR(i,a,b) for(int i=a;i<=b;i++) #define FORR(i,a,b) for(int i=a;i>=b;i--) #define S second #define F first #define pb push_back #define SZ(x) (int)x.size() #define all(x) x.begin(),x.end() #define err(x) cerr<<#x<<" : "<<x<<'\n' #define MOD(x) if(x>=M) x-=M; if(x<0) x+=M; using namespace std; typedef pair<int,int> pii; const int N=1e5+4; const int INF=1e15+100; const int PW=32; int kh[5]; int n,k,m; vector<int> adj[N]; vector<int> W[N]; int dp[N][PW]; void pre(){ FOR(i,0,4) kh[i]=-1; FOR(i,1,n) FOR(j,0,PW-1) dp[i][j]=INF; } int LOG(int x){ int i=0; x/=2; while(x){ i++; x/=2; } return i; } void FILL(){ FOR(i,1,n) dp[i][0]=0; FOR(j,1,PW-1){ FOR(i,1,n){ if(j==(j&(-j))){ if(i==kh[LOG(j)]) dp[i][j]=0; continue; } int mask=j; for(int pw=mask;pw>0;pw=(pw-1)&mask){ dp[i][j]=min(dp[i][j],dp[i][pw]+dp[i][(pw^j)]); } } set<pii> st; FOR(i,1,n) st.insert({dp[i][j],i}); while(!st.empty()){ pii x0=*(st.begin()); int wmn=x0.F; int umn=x0.S; st.erase(x0); FOR(i,0,SZ(adj[umn])-1){ int v=adj[umn][i]; int w=W[umn][i]; if(dp[v][j]>w+wmn){ st.erase({dp[v][j],v}); dp[v][j]=min(dp[v][j],w+wmn); st.insert({dp[v][j],v}); } } } } } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cin>>n>>k>>m; pre(); FOR(i,0,k-1) cin>>kh[i]; FOR(i,1,m){ int u,v,w; cin>>u>>v>>w; adj[u].pb(v); adj[v].pb(u); W[u].pb(w); W[v].pb(w); } FILL(); int k2=pow(2,k)-1; int mn=INF; FOR(i,1,n) mn=min(mn,dp[i][k2]); cout<<mn<<'\n'; return 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...