https://www.acmicpc.net/problem/17942
bfs 에서 노드순서대로 완전탐색 하는게 문제인거 같은데
어떤식으로 접근해야 될까요...
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
int N;// 알고리즘 개수
int M;// 최소한 배우고자 하는 알고리즘의 개수
vector<int> v;// 각 알고리즘 배우는데 필요한 시간
vector<pair<int,int>> arr[100001];
bool visited[100001];
bool bfs(int MID){// 이 공부량으로 M이상 거쳐갈 수 있는지
// 공부량은 누적된다.
// 일정 공부량 이하가되면 노드에 진입할 수 있게 짜기
for(int i=0;i<N;i++){
vector<int>temp;
int maxi=0;
int counT=1;
for(int t=0;t<v.size();t++){
temp.push_back(v[t]);
}
// mid 랑 비교
if(temp[i]>MID){
continue;
}
queue<int> q;
// 현재 노드/현재 공부량
q.push(i+1);
// 여기서는 1번노드, 18값,카운트 1
fill_n(visited,100001,false);
visited[i+1]=true;
while(!q.empty()){
int now=q.front();
q.pop();
if(counT==M){
return true;
}
for(int t=0;t<arr[now].size();t++){
int next=arr[now][t].first;
int m_cost=arr[now][t].second;
temp[next-1]-=m_cost;
if(MID<temp[next-1]){
continue;
}
if(visited[next]==true){
continue;
}
visited[next]=true;
q.push(next);counT+=1;
}
}
}
return false;
}
int main(){
cin>>N>>M;
int a;
for(int i=0;i<N;i++){
scanf("%d",&a);
v.push_back(a);
}
int R;
cin>>R;
int s,e,c;
for(int i=0;i<R;i++){
scanf("%d %d %d",&s,&e,&c);
arr[s].push_back({e,c});
}
int start=1;
int end=100000000;
while(start<=end){
int mid=(start+end)/2;
if(bfs(mid)==true){
end=mid-1;
}else{
start=mid+1;
}
}
cout<<start;
}
아마 디테일이 부족할거 같긴 한데 내 생각은 이래.
1. 주어진 공부량들은 일단 배열에 받고 (공부량, 번호)로 pair로 묶은걸 우선순위 큐(최소힙)에 넣는다. 2. 줄여주는 relation은 그래프로 만든다. 그럼 간선 리스트를 만드는 vector의 성분도 (대상 번호, 줄이는 양)의 pair가 된다. 3. 우선순위 큐에 넣은걸 빼면서 뺀 번호에서 이어진 간선들을 탐색한다. 간선을 탐색할 때마다 공부량 줄어든 녀석을 다시 우선순위 큐에 넣는다. 4. 이 과정에서 이미 뽑힌 녀석은 고려할 필요가 없고 (나중에 뽑은 녀석이 더 공부량이 높음), 뽑힌 녀석을 visit 배열에 저장하면 나중에 공부량이 줄어들지 않은 번호가 같은 녀석은 visit 배열을 이용해서 거를 수 있다. 5. 이렇게 M개를 뽑으면 끝 아닐까?
근데 이러면 시간 초과 여부를 모르겠으니까 뭔가를 더 써야하나 싶기도 하고..
오감사해요!!될거같아요 해볼게요ㅠㅜㅜㅠ
정말똑똑하시군요
정말감사해요!
글쎄.. 틀린 접근이면 시간 낭비를 하는게 아닐까... 걱정이 되네 ㅜㅜ
파라매트릭서치 같은데
풀었음?
2시 전에 혹시 못 풀었으면 코드 공유해줄게.
넹...당신은천재에요..
코드채첨현황에서 확인했습니다 정말감사해요ㅠㅠ
최대힙 쓰는거 보소 ㅋㅋ
ㅋㅋㅋㅋ그 비교함수넣어서 minheap으로하는게낫나요??
뭐 어떻게 하든 상관은 없고 나도 예전엔 너처럼 했는데... 그냥 기능을 제대로 알아두는게 나중에는 필요하더라구.
아하감사합니다!!