https://www.acmicpc.net/problem/17396
이 문제는 다 풀어놓고 하나를 실수 해서 조금 헤맸었다
이 문제는 일반적인 다익스트라 문제이다 이에 소스코드는 이렇게 되고 25% 에서 이슈가 있었다
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> djikstra_pq;
vector<pair<int, int>> edgeList[100000];
vector<int> distance_v;
int testCase;
int n, d, c;
#define INF 1000000001
void djikstraSolution(int start) {
int startNode = start;
int toCost = 0;
djikstra_pq.push({ toCost,startNode });
while (!djikstra_pq.empty())
{
int vertex = djikstra_pq.top().second;
int toCost = djikstra_pq.top().first;
djikstra_pq.pop();
if (toCost > distance_v[vertex])
continue;
for (int i = 0; i < edgeList[vertex].size(); i++) {
int nextVertex = edgeList[vertex][i].first;
int nextCost = edgeList[vertex][i].second;
if (distance_v[nextVertex] > nextCost + toCost) {
distance_v[nextVertex] = nextCost + toCost;
djikstra_pq.push({ nextCost + toCost,nextVertex });
}
}
}
}
int main() {
cin >> testCase;
for (int i = 0; i < testCase; i++) {
cin >> n >> d >> c;
for (int i = 0; i < d; i++) {
int from, to, cost;
cin >> from >> to >> cost;
edgeList[to].push_back({ from,cost });
}
distance_v.assign(n + 1, INF);
int cpuCnt, lastSecond;
djikstraSolution(c);
lastSecond = 0;
cpuCnt = 0;
distance_v[c] = 0;
for (int i = 1; i <= n; i++) {
if (distance_v[i] != INF) {
cpuCnt++;
if (distance_v[i] > lastSecond) {
lastSecond = distance_v[i];
}
}
edgeList[i].clear();
}
cout << cpuCnt << " " << lastSecond << endl;
}
}
이런식으로 되는데 내가 처음에 distanceVector를 초기화 해줄 때 나에서부터 나까지의 거리는 0이라고 설정을 안해놓았었다 그 후 무조건 감염 PC는 하나니 cpuCnt값을 1로두고 셌다 근데 문제는 여기서 a->b b->a 로가는 경로가 생길시 a의 경로값이 갱신 되면서
if (distance_v[i] != INF) {
cpuCnt++;
이 부분에서 CPUCNT가 하나더 증가해서 이미센 감염피씨를 한번 더세면서 문제가 틀렸었다 이에 감염된 피씨의 초를 0으로 바꿔주고 cpuCNt의 값을 0으로 바꿔주니 정상적으로 나왔다
'백준(코테준비) > DP' 카테고리의 다른 글
백준 17404 / CPP / Dp (0) | 2025.01.16 |
---|---|
프로그래머스 LV3 / 정수 삼각형 /DP/ C++ (1) | 2024.11.21 |
백준 17396 /CPP 다익스트라 (0) | 2024.10.17 |
백준 1956/C++ (0) | 2024.10.17 |
백준 2133 / c++ (0) | 2024.08.15 |