본문 바로가기
알고리즘/백준

백준 10282 해킹 C++

by ash9river 2025. 2. 11.

간단한 해설

 

단순하게 다익스트라를 하면 된다. (c에서 시작해서, b->a로 이어지는데, s초가 더해진다.)

그러나 단순하게 2차원 배열로 그래프를 만들면 25%정도에서 메모리 초과가 발생한다.

나는 그래서 연결리스트로 풀 수 있지만 꼼수로 다음과 같이 그래프 연결이 필요한 부분만 연결하였다.

vector<vector<pair<ll,ll>>> graph(n+1,vector<pair<ll,ll>>());
for(int i=0;i<d;++i){
    ll a,b,s;
    cin>>a>>b>>s;
    graph[b].push_back({a,s});
}

 

 

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#define ll long long
using namespace std;

int main(){
    cin.tie(0);
    ios_base::sync_with_stdio(0);
    int t;
    cin>>t;
    while(t-->0){
        ll n,d,c;
        cin>>n>>d>>c;
        vector<vector<pair<ll,ll>>> graph(n+1,vector<pair<ll,ll>>());
        for(int i=0;i<d;++i){
            ll a,b,s;
            cin>>a>>b>>s;
            graph[b].push_back({a,s});
        }
        priority_queue<pair<ll,ll>> q;
        q.push({0,c});
        pair<ll,ll> ans={0,0};//gae,time
        vector<ll> visited(n+1,987654321);
        visited[c]=0;
        while(!q.empty()){
            ll time=-q.top().first;
            ll idx=q.top().second;
            q.pop();
            for(int i=0;i<graph[idx].size();++i){
                if(graph[idx][i].second+time<visited[graph[idx][i].first]){  
                    visited[graph[idx][i].first]=graph[idx][i].second+time;
                    q.push({-visited[graph[idx][i].first],graph[idx][i].first});
                }
            }
        }
        for(int i=1;i<=n;++i){
            if(visited[i]<987654321){
                ++ans.first;
                ans.second=max(ans.second,visited[i]);
            }
        }
        cout<<ans.first<<" "<<ans.second<<"\n";
    }
}

'알고리즘 > 백준' 카테고리의 다른 글

백준 134760 구슬 탈출 2 C++  (0) 2025.02.24
백준 16197 두 동전 C++  (0) 2025.02.24
백준 28449 누가 이길까 C++  (0) 2025.02.08
백준 1911 흙길 보수하기 C++  (0) 2025.01.15
백준 2636 치즈 C++  (0) 2025.01.09