이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define inf 2000000000
#define N 100050
#define P 40
#define f first
#define s second
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
int n, m, k, city[10], dp[P][N], id[N];
vector<pii> grafo[N];
void dijkstra()
{
priority_queue< pair<pii, int>, vector<pair<pii, int> >, greater < pair<pii, int > > > pq;
for(int i = 1; i <= n; i++)
for(int j = 0; j < P; j++)
dp[j][i] = inf;
for(int i = 0; i < k; i++) dp[1<<i][city[i]] = 0, pq.push( { { 0, (1<<i) }, city[i] } );
while(!pq.empty())
{
int x = pq.top().s, mask = pq.top().f.s, d = pq.top().f.f;
pq.pop();
if(d > dp[mask][x]) continue;
for(auto v: grafo[x])
{
int mask2 = mask;
if(id[v.f]) (mask2 |= (1<<(id[v.f])));
if(dp[ mask2 ][v.f] > dp[mask][x] + v.s)
{
dp[ mask2 ][v.f] = dp[mask][x] + v.s;
pq.push({{ dp[mask2][v.f], mask2 }, v.f});
}
}
}
}
int dp2[N][P][P];
int solve(int x, int id, int mask)
{
if(mask == (1<<k) - 1) return 0;
if(id >= P || mask >= P) return inf;
if(dp2[x][id][mask] != -1) return dp2[x][id][mask];
int mask2 = (mask | id);
int add = (dp[id][x] < inf ? (solve(x, id + 1, mask2) + dp[id][x]) : inf);
int nadd = solve(x, id + 1, mask);
//cout<<x<<" "<<id<<" "<<mask<<" "<<add<<" "<<nadd<<"\n";
return dp2[x][id][mask] = min(add, nadd);
}
int main()
{
//ios::sync_with_stdio(false); cin.tie(0);
cin>>n>>k>>m;
for(int i = 0; i < k; i++) cin>>city[i], id[ city[i] ] = i;
for(int i = 1, a, b, c; i <= m; i++)
{
cin>>a>>b>>c;
grafo[a].push_back({b, c});
grafo[b].push_back({a, c});
}
dijkstra();
memset(dp2, -1, sizeof dp2);
int ans = inf;
for(int i = 1; i <= n; i++) ans = min(ans, solve(i, 0, 0));
cout<<ans<<"\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |