https://www.acmicpc.net/problem/20168
20168번: 골목 대장 호석 - 기능성
첫 줄에 교차로 개수 N, 골목 개수 M, 시작 교차로 번호 A, 도착 교차로 번호 B, 가진 돈 C 가 공백으로 구분되어 주어진다. 이어서 M 개의 줄에 걸쳐서 각 골목이 잇는 교차로 2개의 번호와, 골목의
www.acmicpc.net
그래프 탐색을 통해 푸는 문제였습니다.
N개의 노드와 M개의 에지로 이루어진 그래프라고 볼 수 있습니다. 노드의 개수가 최대 10개고 시작과 도착이 정해져있으며 한 노드에서 특정 노드로 가는 에지는 최대 1개입니다. 따라서 그래프 탐색의 시간복잡도는 O(8!)가 됩니다.
그래프 탐색과정에서 최대요금만 기록해가며 도착 노드에 도달했을때 현재까지 나온 가장작은 최대요금과 비교하면 됩니다.
#include<stdio.h>
#include<iostream>
#include<vector>
using namespace std;
bool visit[11];
vector<vector<pair<int,int>>> E(11,vector<pair<int,int>>());
int N,M,A,B,C;
int solve=2e9;
int mymax(int a,int b){
return a>b ? a : b;
}
void dfs(int now,int suchisim,int cost){
visit[now]=true;
if(suchisim>=solve || cost>C) return;
if(now==B){
if(cost<=C && suchisim<solve){
solve=suchisim;
}
return;
}
for(auto i : E[now]){
if(!visit[i.first]) dfs(i.first,mymax(suchisim,i.second),cost+i.second);
visit[i.first]=false;
}
}
int main(){
cin>>N>>M>>A>>B>>C;
for(int x=0;x<M;x++){
int src,dst,cost;
cin>>src>>dst>>cost;
E[src].push_back({dst,cost});
E[dst].push_back({src,cost});
}
dfs(A,0,0);
if(solve==2e9){
cout<<-1;
}
else{
cout<<solve;
}
}
'PS > boj' 카테고리의 다른 글
백준 25200 곰곰이와 자판기 (0) | 2023.01.05 |
---|---|
백준 24229 모두싸인 출근길 (0) | 2023.01.04 |
백준 6987 월드컵 (0) | 2023.01.02 |
백준 16965 구간과 쿼리 (0) | 2023.01.01 |
백준 16719 ZOAC (0) | 2022.09.11 |