# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
207053 | Pentagon | 주유소 (KOI16_gas) | C++14 | 909 ms | 26232 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
//Real Problem
int n,m,prc[2600],a,b,w;
long long DT[2600];
vector<int> arr;
bool cmp(int a,int b){
if(prc[a]==prc[b])
return a<b;
return prc[a]<prc[b];
}
//for Dijkstra
int dis[2600][2600],INF=1e9;
struct node{
int num,d;
bool operator <(const node& tmp) const{
return d>tmp.d;
}
};
vector<vector<node> > v;
priority_queue<node> pq;
void Dijkstra(int s,int D[]){
fill(D+1,D+n+1,INF);
D[s]=0; pq.push(node{s,0});
while(!pq.empty()){
auto cur=pq.top(); pq.pop();
if(cur.d>D[cur.num]) continue;
for(auto&next : v[cur.num]){
if(cur.d+next.d>=D[next.num]) continue;
D[next.num]=D[cur.num]+next.d;
pq.push(node{next.num,D[next.num]});
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) arr.push_back(i),scanf("%d",prc+i);
v.resize(n+1);
while(m--){
scanf("%d%d%d",&a,&b,&w);
v[a].push_back(node{b,w});
v[b].push_back(node{a,w});
}
for(int i=1;i<=n;i++) Dijkstra(i,dis[i]);
sort(arr.begin(),arr.end(),cmp);
for(int i=0;i<n;i++){
int k=arr[i];
DT[k]=1LL*dis[k][n]*prc[k];
for(int j=0;j<i;j++){
int k2=arr[j];
DT[k]=min(DT[k],1LL*dis[k][k2]*prc[k]+DT[k2]);
}
if(arr[i]==1) break;
}
printf("%lld",DT[1]);
}
컴파일 시 표준 에러 (stderr) 메시지
# | 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... |