-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
27-seongwon030 #97
base: main
Are you sure you want to change the base?
27-seongwon030 #97
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
κ·Έλ₯ λ¨μνκ² μ΅μμ μ₯νΈλ¦¬ + κ°μ κ°±μ ν΄μ€ λ μ΄μ κ°μ κΈ°μ΅ν΄μ£Όλ©΄ λλ λ¨μν λ¬Έμ λΌκ³ μκ°νμμ΅λλ€.
μ²μμ μ κ·Όνμ λ μλ°©ν₯μΈ μ€ μκ³ A <-> B λ‘ μ°κ²°ν΄μ νμμμ΅λλ€.
μ΄μ°μ μ° κ°μ λμ€μ§λ§ κΈΈμ κΌ¬μμ λ λ°μνλ μμΈ μΌμ΄μ€κ° λͺ
νν μ‘΄μ¬νμ΅λλ€.
κ·Έλ κ² λ¬Έμ λ₯Ό λ€μ μ½μ΄λ³΄μμ λ λ²μ€λ λΉμ°ν A -> Bλ‘ κ°λꡬλ κ³ λ‘ λ¨λ°©ν₯μ΄κ΅¬λλ₯Ό κΉ¨λ«λλ° μκ°μ μ’ λ§μ΄ μμνμ΅λλ€ ^^;
μ λ λ²μ€κ° μν λ²μ€λ λλμ€ μκ³ A <-> B μκ² κ±°λ νλλ° μλλλΌκ΅¬μ γ
γ
;
κ·Έλμ A <- Bμ λν μ½λλ₯Ό μ κ±°νμ΅λλ€. (λ¬Έμ κ° μ‘°κΈ λΆμΉμ ν κ² κ°κΈ°λνκ³ ..?)
μ΄μ κ° λμμμ μ΅μ 거리λ₯Ό ꡬνμΌλ μ΄μ ans
λ°°μ΄μ μ§λμ¨ λμλ€μ μ μ₯νλ©΄ λλλ° μ΄ λΆλΆμ λ°λ‘ paths
λ°°μ΄μ λ§λ€μ΄μ νμ©νμμ΅λλ€.
λ€λ§ μ¬κΈ°μ 첫 λ²μ§Έλ‘ μ λ μ½κ² κ°λ κΈΈμ΄ λ μ€λ₯΄μ§ μλκ΅°μ. κ·Έλ₯ DFS λ°©μμΌλ‘ νμ΅λλ€.
- Aλ²μ§Έ λμμμ Bλ²μ§Έ λμλ‘ κ°λ μ΅μ λΉμ©μ
M
μ΄λΌκ³ νμμ λ - Bλ²μ§Έ λμμμ Aλ²μ§Έ λμλ‘ κ°λ κΈΈλ€μ μλ°©ν₯μΌλ‘ νμν΄μ€λλ€. μ΄λ μλ°©ν₯μΌλ‘ κ°λ κΈΈλ€μ λ€μ΅μ€νΈλΌλ₯Ό ν΅ν΄ μ΅μ λΉμ©μ ꡬνλ©΄μ μ μ₯ν΄μ€¬μ΅λλ€.
- μ¬κΈ°μ κ³μ°μ΄ μ‘°κΈ νμνκ²
M
μ΄λΌλ μ΅μ λΉμ©μ΄ μμ λ Bλ²μ§Έ λμμμ B-1λ²μ§Έ λμλ‘ μ΄λνκ² λλ©΄M
- COST[B-1]μ κ²°κ³Ό κ°μ A λ²μ§Έ λμμμ B-1 λ²μ§Έ λμλ‘ κ°λλ°μ μμλλ μ΅μ λΉμ© κ°μ λλ€.
κ³ λ‘ λ€μ λμλ‘ μ΄λνλλ° λλ λΉμ©μ λΊμ λ A λ²μ§Έ λμμμ N λ²μ§Έ λμλ‘ μ΄λνλ λΉμ©μ κ°μ΄ λμ€μ§ μμΌλ©΄ κ·Έ κΈΈμ μ΅μ λΉμ©μΌλ‘ ꡬμ±λ λμκ° μλλΌλ μ μ μ΄μ©νμ¬ λ³΅μ‘λλ₯Ό μ€μ΄κ³ μ λ
Έλ ₯νμμ΅λλ€.
μλκ° ν΄λΉ λΆλΆμ
λλ€.
bool FindPath(int cur, int cost)
{
if (cur == start)
{
if(cost == 0) return true;
return false;
}
for (auto node : paths[cur])
{
if (visited[node.index]) continue;
if (distances[node.index] == cost - node.dist)
{
visited[node.index] = true;
if (FindPath(node.index, cost - node.dist))
{
ans.push_back(node.index);
return true;
}
visited[node.index] = false;
}
}
return false;
}
λΉμ°ν μκ° μ΄κ³Όκ° λκΈΈλ λ€μ μκ°μ ν΄λ΄€μ λ κ΅³μ΄ μ΄λ΄νμλ μλκ΅°μ. κ·Έλ₯ κ°μ΄ λ³νμ λ, μ¦ κ°μ΄ λ³νλ κ²μ μ΅μ λΉμ© 루νΈμ΄κΈ°μ λ€μ λ Έλμ νμ¬ λ Έλμ μΈλ±μ€ κ°μ μ μ₯ν΄μ£Όλ©΄ λμλ€λ κ²μ κΉ¨λ«κ³ μμ νμ§λ§ κ·Έλλ μκ°μ΄κ³Όκ° λλκ΅°μ.
κ·Έλμ μ§λ¬Έκ²μνμ μ‘°κΈ μ°Έκ³ νκ² λμλλ λ²μ€μ κ°μκ° μ΅λ 10λ§κ°κ° μ£Όμ΄μ§λλ° νμ¬ λ°©λ¬Έν λ
Έλλ₯Ό κΈ°μ μΌλ‘ μ°κ²°λμ΄ μλ λ²μ€λ€μ κ°μλ₯Ό κ³μ νμνκ² λλ©΄ μκ° μ΄κ³Όκ° λ°μνλ κ²μ κΉ¨λ¬μμ΅λλ€.
κ³ λ‘ λ€μ μ§μ μ λ°©λ¬Έν λ λΏλ§ μλλΌ μ°μ μμ νμ μ μ₯λμ΄ μλ κ°λ€μ λΉμ©μ΄ μ΅μ λΉμ©μΌλ‘ μ μ₯λμ΄ μλ κ°λ³΄λ€ ν° κ²½μ°λ 체ν¬ν΄μ€ νμκ° μλ€λ κ²μ κΉ¨λ«κ³ 쑰건문μ μΆκ°ν΄μ€¬λλ ν΅κ³Όνμμ΅λλ€.
μλΉν νΌκ³€νλ λ¬Έμ μμ΅λλ€..
μ 체 μ½λ μ λλ€. #include <iostream>
#include <queue>
#include <vector>
using namespace std;
struct Node
{
int index;
int dist;
Node(int index, int dist)
{
this->index = index;
this->dist = dist;
}
};
int n, m, start, goal;
vector<vector<Node>> nodes;
vector<int> paths;
vector<int> distances;
vector<bool> visited;
void Solve()
{
cin >> n;
nodes.assign(n + 1, vector<Node>());
paths.assign(n + 1, 0);
distances.assign(n + 1, 1e8);
visited.assign(n + 1, false);
cin >> m;
while (m--)
{
int v1, v2, edge;
cin >> v1 >> v2 >> edge;
nodes[v1].push_back(Node(v2, edge));
}
cin >> start >> goal;
priority_queue < pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
distances[start] = 0;
pq.push({ 0, start });
while (!pq.empty())
{
int cur_index = pq.top().second;
int cur_dist = pq.top().first;
pq.pop();
if (cur_dist > distances[cur_index]) continue;
for (auto node : nodes[cur_index])
{
int next_index = node.index;
int next_dist = node.dist + cur_dist;
if (next_dist < distances[next_index])
{
distances[next_index] = next_dist;
pq.push({ next_dist, next_index });
paths[next_index] = cur_index;
}
}
}
cout << distances[goal] << "\n";
vector<int> ans;
ans.push_back(goal);
while (goal != start)
{
ans.push_back(paths[goal]);
goal = paths[goal];
}
cout << ans.size() << "\n";
auto printReverse = [&ans]() {
for (auto it = ans.rbegin(); it != ans.rend(); ++it)
{
cout << *it << " ";
}
};
printReverse();
}
int main()
{
cin.tie(nullptr);
ios::sync_with_stdio(false);
Solve();
return 0;
} |
π λ¬Έμ λ§ν¬
μ΅μλΉμ©κ΅¬νκΈ°2
βοΈ μμλ μκ°
2μκ°
λ¬Έμ μ€λͺ
μ μ κ³Ό κ°μ μ¬μ΄μ λΉμ©μ΄ μ£Όμ΄μ§κ³ μΆλ° μ§μ μμ λμ°© μ§μ μ μ£Όμ΄μ§ λ, μΆλ° μ§μ μμ λμ°© μ§μ κΉμ§μ μ΅μ λΉμ©, μ΅μ λΉμ©μ κ°λ κ²½λ‘μ ν¬ν¨λμ΄μλ λμμ κ°μλ₯Ό μΆλ ₯νλ€. μΆλ° λμμ λμ°© λμλ ν¬ν¨νλ€.
β¨ μλ μ½λ
ν΄λΉ λ¬Έμ λ λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μΌλ‘ μ΅μλΉμ©μ κ°±μ νλ©΄μ μ΅μλΉμ©μ ꡬν΄μΌ ν©λλ€.
μΆλ ₯κ³Όμ μμ μ΄μ λ Έλλ₯Ό κΈ°λ‘νκ³ μΆλ ₯νλλ° μ λ₯Ό μ’ λ¨Ήμμ΅λλ€.
λ€μ΅μ€νΈλΌ
prev_node
리μ€νΈμ μ μ₯ν΄λμ΅λλ€.μ΅λ¨κ±°λ¦¬
v1
μ μΈμλ‘ νμ¬ λ€μ΅μ€νΈλΌ ν¨μλ₯Ό μ€ν -> μΆλ°λ Έλμμ λͺ¨λ λ ΈλκΉμ§μ μ΅λ¨κ±°λ¦¬λ₯Ό κ³μ°v2
κΉμ§μ 거리λ₯Ό ꡬν©λλ€μ΄μ λμλ€
prev_node
μλv2(λμ°© λ Έλ)κΉμ§μ λμ λ²νΈ
κ° μ μ₯λμ΄ μμ΅λλ€path
: λμ°©λ Έλλ₯Ό μ΄κΈ°κ°μΌλ‘ νλ 리μ€νΈpath
μ λμ λ²νΈλ€μ μ μ₯ν©λλ€