어흥
[백준 13907] 세금 (C++) 본문
728x90
반응형
문제 링크: www.acmicpc.net/problem/13907
1. 주의할 점
- 세금이 오를때마다 다익스트라 알고리즘을 수행하지 않는다
2. 구현
- 기존 다익스트라 알고리즘에서 사용하던 Dist[] 배열을 변형시킨다
- Dist[][] 배열을 통해 [각 지점][각 지점까지 도달하는데 거친 Node수] 형태를 만족하며 최단경로 값을 저장한다
- dijkstra() 함수를 통해 Dist[][] 배열을 구한다
- Cal() 함수를 통해 세금이 Sum만큼 쌓였을때의 최단경로 값을 출력한다
#define MAX 9876543210
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
struct info{
int idx,cnt,val;
};
struct cmp{
bool operator()(info &a, info &b){
return a.val > b.val;
}
};
info tmp;
int node,edge,s,e,tax,start,target,mul,val,sum=0;
vector<info> v[1001];
int dist[1001][1001]; //각 지점, 몇 번 거쳤는지
void cal(){
int result = MAX;
for(int i=1;i<node;i++){
int vv = dist[target][i]+i*sum;
result = min(result,vv);
}
cout<<result<<'\n';
}
void dijkstra(){
priority_queue<info,vector<info>,cmp> pq;
pq.push({start,0,0});
dist[start][0]=0;
while(!pq.empty()){
int cidx = pq.top().idx;
int cc = pq.top().cnt;
int cv = pq.top().val;
pq.pop();
if(dist[cidx][cc]<cv) continue;
for(int i=0;i<v[cidx].size();i++){
int next = v[cidx][i].idx;
int nv = v[cidx][i].val;
if(dist[next][cc+1]>cv+nv){
dist[next][cc+1]=cv+nv;
pq.push({next,cc+1,cv+nv});
}
}
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
cin>>node>>edge>>tax>>start>>target;
for(int i=1;i<=node;i++)
for(int j=0;j<node;j++)
dist[i][j]=MAX;
for(int i=0;i<edge;i++){
cin>>s>>e>>val;
v[s].push_back({e,0,val});
v[e].push_back({s,0,val});
}
dijkstra();
cal();
for(int i=0;i<tax;i++){
cin>>mul;
sum+=mul;
cal();
}
return 0;
}
728x90
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 11000] 강의실 배정 (C++) (0) | 2021.03.26 |
---|---|
[백준 2982] 국왕의 방문 (C++) (0) | 2021.03.26 |
[백준 13424] 비밀 모임 (C++) (0) | 2021.03.19 |
[백준 2307] 도로 검문 (C++) (0) | 2021.03.19 |
[백준 1446] 지름길 (C++) (0) | 2021.03.18 |
Comments