# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
575688 | web | 경주 (Race) (IOI11_race) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <map>
#include <iostream>
#include <climits>
#include "race.h"
#include <vector>
#include <bitset>
#include <algorithm>
using namespace std;
vector<vector<pair<int, long long>>> adjList;
map<int,int> indices;
int DFS(int currNode, int parentNode, int costUsed, int depth, int K, int bestPoss, int currBest)
{
if (depth > currBest)
return -1;
////cout<<"curr node "<<currNode<<endl;
if(costUsed == K)
return depth;
if(costUsed > K)
return -1;
int bestL = INT_MAX;
for(auto node : adjList[currNode])
{
////cout<<"child: "<<node.first<<endl;
if(node.first == parentNode)
continue;
int l = DFS(node.first, currNode, costUsed+node.second, depth+1, K, bestPoss, currBest);
////cout<<"l = "<<l<<endl;
if(l < bestL && l!= -1)
{bestL = l;
////cout<<"new best L"<<endl;
}
if (bestL == bestPoss)
return bestL;
}
if(bestL ==INT_MAX)
return -1;
return bestL;
}
int best_path(int N, int K, int H[][2], int L[])
{
int maxWEdge = 0;
for(int i =0; i<N-1; ++i)
{
if(L[i] > K)
continue;
if (L[i] > maxWEdge)
maxWEdge = L[i];
//cout<<"want to add edge "<<i<<endl;
//cout<<H[i][0]<<" "<<H[i][1]<<" "<<L[i]<<endl;
if(indices.find( H[i][0]) == indices.end())
{
//cout<<"made new index"<<endl;
indices[H[i][0]] = adjList.size();
//cout<<H[i][0] <<" => "<<adjList.size()<<endl;
adjList.push_back({});
}
if(indices.find( H[i][1]) == indices.end())
{
//cout<<"made new index"<<endl;
indices[H[i][1]] = adjList.size();
//cout<<H[i][1] <<" => "<<adjList.size()<<endl;
adjList.push_back({});
}
//cout<<"added {" <<indices[H[i][0]]<<" "<<L[i]<<"}"<<" to " << H[i][1]<<endl;
//cout << "added {" << indices[H[i][1]] << " " << L[i] << "}" << " to " << H[i][0] << endl;
adjList[indices[H[i][1]]].push_back({indices[H[i][0]], L[i]});
adjList[indices[H[i][0]]].push_back({ indices[H[i][1]], L[i] });
}
for(auto node: adjList)
{
//cout<<endl;
for(auto edge: node)
{
//cout<<"edge: "<<edge.first<<" "<<edge.second<<endl;
}
}
//////cout<<"here"<<endl;
int bestPath = INT_MAX;
int bestPossDepth = (floor(static_cast<long double>(K) / static_cast<long double> (maxWEdge)));
for(int i =0 ; i<adjList.size(); ++i)
{
int l = DFS(i, -1, 0, 0, K, bestPossDepth, bestPath);
////////cout<<"DFS sur"<<endl;
if(l != -1 && l < bestPath)
bestPath = l;
if(bestPath == 1)
break;
}
//////cout<<"there"<<endl;
if(bestPath == INT_MAX)
return -1;
return bestPath;
}