이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define INF 100000000000000000
#define maxN 100002
using namespace std;
long long n,m,k,t,i,j,x,y,z,dp[35][maxN];
vector < pair<long long,long long> > adj[maxN];
vector <long long> v;
bool mar[maxN];
int main()
{
cin>>n>>k>>m;
for(i=0;i<k;i++){
cin>>x;
x--;
v.push_back(x);
}
for(i=0;i<m;i++){
cin>>x>>y>>z;
x--;
y--;
adj[x].push_back(make_pair(y,z));
adj[y].push_back(make_pair(x,z));
}
for(i=0;i<32;i++){
for(j=0;j<n;j++) dp[i][j]=INF;
}
for(i=0;i<v.size();i++){
dp[1<<i][v[i]]=0;
}
for(i=0;i<pow(2,k);i++){
for(j=0;j<n;j++){
for(t=0;t<min(i,i/2+2);t++){
dp[i][j]=min(dp[i][j],dp[t][j]+dp[i^t][j]);
}
}
priority_queue <pair<long long,long long>, vector<pair<long long,long long>> , greater<pair<long long,long long>>> pq;
for(j=0;j<n;j++){
pq.push({dp[i][j],j});
}
memset(mar,false,n+2);
while(!pq.empty()){
x=pq.top().second;
pq.pop();
if(mar[x]) continue;
for(j=0;j<adj[x].size();j++){
if(dp[i][x]+adj[x][j].second<dp[i][adj[x][j].first]){
dp[i][adj[x][j].first]=dp[i][x]+adj[x][j].second;
pq.push({dp[i][adj[x][j].first],adj[x][j].first});
}
}
}
}
long long ans=INF;
for(i=0;i<n;i++){
ans=min(ans,dp[(1<<k)-1][i]);
}
cout<<ans<<endl;
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
cities.cpp: In function 'int main()':
cities.cpp:31:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(i=0;i<v.size();i++){
~^~~~~~~~~
cities.cpp:49:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(j=0;j<adj[x].size();j++){
~^~~~~~~~~~~~~~
# | 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... |