: ๊ธฐ๋ณธํ์ top์ ๊ฐ์ฅ ํฐ๊ฐ์ด ์จ๋ค.
-> less๋ก ๋์ด ์๋ค. bool operator<(const Node& ) const
์ง๊ธ์ ๋ค์ต์คํธ๋ผ์ ๊ฒฝ์ฐ ๊ตฌ์กฐ์ฒด Node์ value ๊ฐ์ด ๋ฎ์ ๊ฒ์ด top์ ์ค๊ฒ ํด์ผ ํ๋ค.
-> ๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ด๋ ๊ฒ ์ฌ์ฉํด์ผ ํ๋ค. : greater๋ฅผ ๋ง๋ค์.
bool operator>(const &Node) const { return value > _obj.value;}
ํธ์ถ ๋ถ๋ถ
priority_queue<Node, vector Node , greater Node > pq;
0) ์์์ ์ pq์ ๋ฃ๊ณ , ์งํํ๊ณ pq์๋ ์ฐ๊ฒฐ๋ ๋
ธ๋๊ฐ ๋ค์ด๊ฐ๋ค.
1) ๊ฑฐ์ณ์ ๊ฐ๋ ์ต์๊ฐ์ ๊ธฐ๋กํ๋ distTable(์ด๊ธฐ๊ฐ์ 10e9)
2) ๊ทธ๋ฆฌ๋ ์ด๊ธฐ ๋๋ฌธ์ visited ๋ณ์ ํ์ ์๋ค.
3) pq์ ๊ฒฝ์ฐ , ๊ฐ์ฅ ๋ฎ์ ๊ฐ์ด ๋์์ผ ํ๋ฏ๋ก, greater
operator >() const ๋ง๋ค์ด์ค์ผ ํ๋ค.
4) ๊ทธ๋ฆฌ๊ณ struct ๋ฅผ ์ฌ์ฉํ ๊ฑฐ๋๊น ! operator>() const
5) cost ๋น๊ตํ ๋๋ currentNode.cost + targetNode.cost ์ distTable์ ๋น๊ตํด์ผ ํ๋ค.
๋น๊ต ํ๋ฉด์ distTable ๋ณด๋ค ์์ง ์๋ค๋ฉด continue ํ๊ณ ,
์ฐ์ด์ด์ pq์ ๊ฐ์ฅ ๋ฎ์๊ฐ์ ๋ฃ์.
ํ์ด ์๊ฐ 240518 23:20 ~ 240519 00:15
: ์ฐ์ ์์ํ struct๋ greater ์ฐ์ฐ์ ๋ง๋ค์ด์ ํ์๋ค.
๋์น๋ถ๋ถ
: ๋ค์ต์คํธ๋ผ๋ ๊ทธ๋ฆฌ๋์ด๊ธฐ ๋๋ฌธ์
๋ง์ฝ์ ํด๋น ์กฐ๊ฑด๋ฌธ์ ๋ค์ด์ค์ง ์๋๋ค๋ฉด, pq์ pushํ ํ์๊ฐ Never! ์ ํ ์๋ค.
-> ํด๋น ์กฐ๊ฑด๋ฌธ ์ ๋ง ์ค์ํ๋ค! ํด๋น ์กฐ๊ฑด๋ฌธ์ ์์ฑํ์ง ์์ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ด๊ณผ ์ค๋ฅ ๋ฐ์ํ๋ค!
#include <iostream>
#include <mutex> // mutex ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํ์
#include <thread>
using namespace std;
#include <vector>
#include <filesystem>
#include <queue>
struct Node
{
int vNum;
int dist;
// ๊ฐ์ฅ ์์๊ฐ์ ์ฐ์ ์์๋ก ํด์ผํ๋ค.
// pq์ ๋ํดํธ๋ ๋ด๋ฆผ์ฐจ์์ด๋ค. top์ด ๊ฐ์ฅ ํฌ๋ค.
// less ์ด๊ณ
// greater ํจ์๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
bool operator>(const Node& _obj) const
{
return dist > _obj.dist;
}
};
//11:20~
int main()
{
int v, e;
cin >> v >> e;
// ์ ์ ๋ฒํธ๋ 1๋ฒ๋ถํฐ v๋ฒ๊น์ง์ด๋ค.
int startNum = 1;
cin >> startNum;
// ํธํฅ๋ฐฉํฅ์ผ๋ก ์งํํด์ผ ํ ๋ฏํ๋ค. ์๋ํ๋ฉด
// 1๋ฒ input 5 1 1 ์ด๋ผ๊ณ ํ๋ค๋ฉด 1์ด ์ถ๋ ฅ๋์ด์ผ ํ๋๋ฐ INF๊ฐ ์ถ๋ ฅ๋จ.
// ๊ฐ์ ์ ๊ฐฏ์ e๋งํผ for๋ฌธ ๋๋ฆฌ๋ฉด์
priority_queue<Node, vector<Node>, greater<Node>> pq;
// ๊ฐ์ค์น๋ 10์ดํ๋ผ๊ณ ํ๋ค .
//
vector<int>distTable(v + 1, 1e9);
vector<vector<pair<int, int>>> vNum(v + 1);
int a, b, c;
for (int i = 0; i < e; ++i)
{
// 5๋ฒ ์ ์ ์ด 1๋ฒ ์ ์ ๊น์ง ๊ฐ๋๋ฐ dist ๋น์ฉ 1 ๋ฐ์.
// ๋ฌดํ์ '๊ฐ' ์ด๋ผ๊ณ ํ์.
// dist Table
// 1 2 3 4 5
// 0 ๊ฐ ๊ฐ ๊ฐ ๊ฐ
// 0 2 3 ๊ฐ ๊ฐ 1๋ฒ์ ๊ธฐ์ค , ๊ทธ๋ฆฌ๊ณ 1๋ฒ ์๋ฃ
// 0 2 3 7 ๊ฐ 2๋ฒ์ ๊ธฐ์ค , ๊ทธ๋ฆฌ๊ณ 2๋ฒ ์๋ฃ
// 0 2 3 7 ๊ฐ 3๋ฒ์ ๊ธฐ์ค.
// check ๋ณ์ ํ์.
// pq์๋ ๋ค์์ ๊ฐ ์ ์ ์ ๋ฒํธ์ dist๋ฅผ ๊ฐ์ง๊ณ ์์.
cin >> a >> b >> c;
// first๋ ํ๊ฒ ์ ์ , second๋ dist
vNum[a].push_back({b , c});
}
// startNum์ ๊ธฐ์ค์ผ๋ก ํด์ ๋ค์ต์คํธ๋ผ ์์!
pq.push(Node{ startNum, 0 });
distTable[startNum] = 0;
while (!pq.empty())
{
Node targetNode = pq.top();
pq.pop();
int targetNum = targetNode.vNum;
int targetDist = targetNode.dist;
// pq์ ๋ฃ๊ธฐ ์ ์ .
// distTable ๋น๊ต ํด์ผ ํ๋ค.
// ๋ฌดํ์ '๊ฐ' ์ด๋ผ๊ณ ํ์.
// dist Table
// 1 2 3 4 5
// 0 ๊ฐ ๊ฐ ๊ฐ ๊ฐ
// 0 2 3 ๊ฐ ๊ฐ 1๋ฒ์ ๊ธฐ์ค , ๊ทธ๋ฆฌ๊ณ 1๋ฒ ์๋ฃ
// 0 2 3 7 ๊ฐ 2๋ฒ์ ๊ธฐ์ค , ๊ทธ๋ฆฌ๊ณ 2๋ฒ ์๋ฃ
// 0 2 3 7 ๊ฐ 3๋ฒ์ ๊ธฐ์ค.
for (int i = 0; i < vNum[targetNum].size(); ++i)
{
int endPoint = vNum[targetNum][i].first;
int dist = vNum[targetNum][i].second;
if (targetDist + dist < distTable[endPoint])
{
distTable[endPoint] = targetDist + dist;
}
// ๋์น๋ถ๋ถ์ ์ด๋ฏธ if ์กฐ๊ฑด๋ฌธ ์ํ์ง ์์ผ๋ฉด continue ํด์ผ ํ๋ค.
else
{
continue;
}
pq.push(Node{ endPoint, distTable[endPoint] });
}
}
for (int i = 1; i <= v; ++i)
{
if (distTable[i] == 1e9)
{
printf("INF\n");
}
else
printf("%d\n", distTable[i]);
}
}
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <limits.h>
#include <algorithm>
#include <map>
#include <future>
#include <thread>
#include <numeric>
#include <stack>
#include <queue>
#include <memory>
#include <set>
#include <string>
#include <stack>
#include <mutex>
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int vertex, edge;
cin >> vertex >> edge;
int start;
cin >> start;
int u, v, w;
// u ์์ v๋ก ๊ฐ๋ ๊ฐ์ค์น๊ฐ w์ธ ๊ฐ์ .
// 5๋ฒ์์ 1๋ก ๊ฐ๋ ๊ฐ์ค์น๋ 1
//[5][1] = 1;
// [ํ๊ฒ ์ ์ ๋ฒํธ : 5] = {๋น์ฉ, ํฅํ๋ ์ ์ .}
vector<vector<pair<int, int>>> path(vertex + 1);
for (int i = 0; i < edge; ++i)
{
cin >> u >> v >> w;
// ๋ฃ์ ๋๋ถํฐ ์๊ฐ์ผ๋ก ๋ฃ๋ ๊ฒ์ด ์๋๋ผ,
// pq์ ๋ฃ์ ๋ ์๊ฐ์ผ๋ก ๋ฃ์...
path[u].push_back({ w, v });
}
//for (int i = 1; i < path.size(); ++i)
//{
// for (int j = 0; j < path[i].size(); ++j)
// {
// cout << i << "๋ฒ ์ ์ ์์ "
// << path[i][j].second << "์ ์ ๊น์ง์ ๊ฐ์ค์น๋ "
// << path[i][j].first << "์
๋๋ค. " << endl;
// }
//}
// ๋ค์ต์คํธ๋ผ ๊ฐ์.
vector<int> dist(vertex + 1, 987654321);
dist[0] = 0;
// ์์์ ์ ์ ์ ์ ๊ฐ์ v๋ณด๋ค๋ ์์.
//vector<bool> visited(vertex + 1, false);
// ๊ฐ์ค์น์ ํฅํ๋ ํ๊ฒํ
์ ์ ์ ์ง์ด๋ฃ์.
priority_queue<pair< int, int>> pq;
pq.push({ 0, start });
dist[start] = 0;
//visited[start] = true;
while (!pq.empty())
{
pair<int,int> target = pq.top();
pq.pop();
int cost = -target.first; // ๋น์ฉ
int vv = target.second; // ํ๊ฒ ์ ์ .
for (int i = 0; i < path[vv].size(); ++i)
{
int nextCost = path[vv][i].first;
int nextNode = path[vv][i].second;
if (nextCost + cost < dist[nextNode])
{
dist[nextNode] = nextCost + cost;
pq.push({ -nextCost, nextNode });
}
}
}
for (int i = 1; i <= vertex; ++i)
{
if (dist[i] == 987654321)
{
//cout << "INF" << "\n";
printf("INF\n");
}
else
{
//cout << dist[i] << "\n";
printf("%d\n", dist[i]);
}
}
return 0;
}
https://velog.io/@kwt0124/memset-vs-fill-%EC%B0%A8%EC%9D%B4%EC%A0%90
-> ๋ฐ๋์, 1๋ฒ์งธ์ ์ผ๋ฐํ, 2๋ฒ์งธ์์๋ ๋ฒกํฐํ , 3๋ฒ์งธ์๋ ๋ด๊ฐ
๋ฐ๋์ ๋น๊ต ๊ตฌ์กฐ์ฒด๋ฅผ ์ ๋ฌํด์ฃผ์. : ์ ๋ ฌ ๋ถ๋ถ์์ ํผ๋ํ์ง ์๊ธฐ ์ํด
์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ฐฑ์ ํ ์ ์๋ dist ๋ฐฐ์ด ํ
์ด๋ธ์ด ํ์ํจ.
dist ํ
์ด๋ธ์ ๊ฒฝ์ ํด์ ๋ค์ด์ค๋ dist์ ๋น๊ต๋ฅผ ํจ.
-> ๊ฒฝ์ dist๊ฐ ๋ ํฌ๋ค๋ฉด, ํ์ ๋ฌด์ํด๋ฒ๋ฆผ.
-> ๋ถ๋ณ์๊ฐ ํ์ ์์!
์์์ dist๋ ์๊ธฐ์์ ์ผ๋ก ๋ค์ด์ค๋ ๊ฐ์ด๋ฏ๋ก 0์ผ๋ก ์ด๊ธฐํ๋ฅผ ํจ.
4๋ฒ ๋
ธ๋๋ฅผ ๊ธฐ์ค์ผ๋กํด์ ํ์ธํจ.
2๋ฒ ๋
ธ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ํด์ ํ์ธํจ.
์ด๋ 2๋ฒ์์ 4๋ฒ์ผ๋ก ํฅํ๊ฒ ๋๋ฉด, dist๋ 4 ์ด์ง๋ง,
// ์์์ ์ธ 1๋ฒ์์ 4๋ฒ์ผ๋ก ๊ฐ๋ dist:1 ์ด๋ฏ๋ก ๋ฌด์๋จ.
์ด๋ฅผ ์ฒ๋ฆฌํ ๋ถ๋ถ์ด ๋ฐ์ ์ฝ๋์
if(dist[ํ์์ค์ธ ๋ ธ๋๋ฒํธ] < ํ์ ์์ ์ธ dist)
continue;
์ด ๋ถ๋ถ ๋ฐ๋์ ํด์ผ ํจ.
memset ๋ณด๋ค๋ fill ํจ์๋ฅผ ์ฌ์ฉํ์.
fill(v.begin(), v.end() , ์ต๋๊ฐ)
์ฐ์ ์์ํ์ ๋น๊ต ์ฐ์ฐ์ ๊ณต๋ถํ๊ธฐ ,
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
#include <iostream>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <memory.h>
int dist[20001];
const int INF = 987654321;
struct compare
{
public:
bool operator()(pair<int, int> a, pair<int, int>b)
{
return a.first > b.first;
}
};
vector<pair<int, int>>node[20001];
void daikstra(vector<pair<int, int>>*node, int startNode)
{
priority_queue<pair<int, int>, vector<pair<int, int>>
, compare>pq;
// ์๊ธฐ ์์ ์ผ๋ก ๊น์ง์ ๋น์ฉ์ 0์.
dist[startNode] = 0;
pq.push(make_pair(0, startNode));
while (!pq.empty())
{
int curNode = pq.top().second;
int curDist = pq.top().first;
pq.pop();
if (dist[curNode] < curDist)
continue;
for (int i = 0; i < node[curNode].size(); ++i)
{
int nextNode = node[curNode][i].first;
int tempDist = node[curNode][i].second;
if (dist[nextNode] > tempDist + curDist)
{
dist[nextNode] = tempDist + curDist;
pq.push(make_pair(dist[nextNode], nextNode));
}
}
}
}
int main()
{
int v, e;
cin >> v >> e;
int startNode;
cin >> startNode;
//v[1] ๋ฒ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋
ธ๋์ ๋ฒํธ๋ฅผ ํธ์ฌ๋ฐฑ์ผ๋ก ์ ์ฅํ์.
//
vector<pair<int, int>>node[20001];
// ๊ฐ์ ์ ๊ฐ์
for (int i = 0; i < e; ++i)
{
int a, b, c;
cin >> a >> b >> c;
node[a].push_back(make_pair(b, c));
}
fill(dist, dist + 20001, INF);
daikstra(node, startNode);
for (int i = 1; i <= v; ++i)
{
if (dist[i] == INF)
{
puts("INF");
}
else
{
printf("%d\n", dist[i]);
}
}
}