๐Ÿคฎ1753๋ฒˆ. ์ตœ๋‹จ ๊ฒฝ๋กœ _ ๋‹ค์ต์ŠคํŠธ๋ผ.

phoenixKimยท2022๋…„ 9์›” 16์ผ
0

๋ฐฑ์ค€ ์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชฉ๋ก ๋ณด๊ธฐ
124/174

์šฐ์„ ์ˆœ์œ„ํ

: ๊ธฐ๋ณธํ˜•์€ 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์— ๊ฐ€์žฅ ๋‚ฎ์€๊ฐ’์„ ๋„ฃ์ž.


์ตœ๊ทผ ํ’€์ด : 240519

  • ํ’€์ด ์‹œ๊ฐ„ 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]);
	}

}

์ตœ๊ทผ ํ’€์ด : 240106

#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;
}

memset vs fill

https://velog.io/@kwt0124/memset-vs-fill-%EC%B0%A8%EC%9D%B4%EC%A0%90

๐Ÿค”์ฃผ์˜ํ•  ์ .

  • ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์šฐ์„ ์ˆœ์œ„ ํ์— ๋„ฃ์„๋•Œ...

    -> ๋ฐ˜๋“œ์‹œ, 1๋ฒˆ์งธ์— ์ผ๋ฐ˜ํ˜•, 2๋ฒˆ์งธ์—์„œ๋Š” ๋ฒกํ„ฐํ˜• , 3๋ฒˆ์งธ์—๋Š” ๋‚ด๊ฐ€
    ๋ฐ˜๋“œ์‹œ ๋น„๊ต ๊ตฌ์กฐ์ฒด๋ฅผ ์ „๋‹ฌํ•ด์ฃผ์ž. : ์ •๋ ฌ ๋ถ€๋ถ„์—์„œ ํ˜ผ๋™ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด

cout ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž.

์ธ์ž๋กœ ๋ฒกํ„ฐ ๋„˜๊ธฐ์ง€ ๋ง๊ณ , ์ „์—ญ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์ž.

์ ‘๊ทผ ๋ฒ•

  • ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์žˆ๋Š” dist ๋ฐฐ์—ด ํ…Œ์ด๋ธ”์ด ํ•„์š”ํ•จ.
    dist ํ…Œ์ด๋ธ”์€ ๊ฒฝ์œ ํ•ด์„œ ๋“ค์–ด์˜ค๋Š” dist์™€ ๋น„๊ต๋ฅผ ํ•จ.
    -> ๊ฒฝ์œ  dist๊ฐ€ ๋” ํฌ๋‹ค๋ฉด, ํƒ์ƒ‰ ๋ฌด์‹œํ•ด๋ฒ„๋ฆผ.
    -> ๋ถˆ๋ณ€์ˆ˜๊ฐ€ ํ•„์š” ์—†์Œ!

  • ์‹œ์ž‘์˜ dist๋Š” ์ž๊ธฐ์ž์‹ ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ๊ฐ’์ด๋ฏ€๋กœ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ํ•จ.

๋‹ค์ต์ŠคํŠธ๋ผ ๋ฌธ์ œ

  1. dist ํ…Œ์ด๋ธ”์—์„œ ๊ฑฐ๋ฆฌ์™€ vs ์šฐํšŒํšŒ์„œ ๋“ค์–ด์˜ค๋Š” ๊ฐ’ + newDist ๋ฅผ ๋น„๊ตํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ , ๋ฐฉ๋ฌธ ๋ถˆ๋ณ€์ˆ˜ ํ•„์š”๊ฐ€ ์—†์Œ.
  • 4๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœํ•ด์„œ ํ™•์ธํ•จ.

  • 2๋ฒˆ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ด์„œ ํ™•์ธํ•จ.
    ์ด๋•Œ 2๋ฒˆ์—์„œ 4๋ฒˆ์œผ๋กœ ํ–ฅํ•˜๊ฒŒ ๋˜๋ฉด, dist๋Š” 4 ์ด์ง€๋งŒ,
    // ์‹œ์ž‘์ ์ธ 1๋ฒˆ์—์„œ 4๋ฒˆ์œผ๋กœ ๊ฐ€๋Š” dist:1 ์ด๋ฏ€๋กœ ๋ฌด์‹œ๋จ.
    ์ด๋ฅผ ์ฒ˜๋ฆฌํ•œ ๋ถ€๋ถ„์ด ๋ฐ‘์˜ ์ฝ”๋“œ์ž„

if(dist[ํƒ์ƒ‰์ค‘์ธ ๋…ธ๋“œ๋ฒˆํ˜ธ] < ํƒ์ƒ‰ ์˜ˆ์ •์ธ dist)
continue;
์ด ๋ถ€๋ถ„ ๋ฐ˜๋“œ์‹œ ํ•ด์•ผ ํ•จ.

  1. memset ๋ณด๋‹ค๋Š” fill ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ž.

    fill(v.begin(), v.end() , ์ตœ๋Œ€๊ฐ’)

  2. ์šฐ์„ ์ˆœ์œ„ํ์˜ ๋น„๊ต ์—ฐ์‚ฐ์ž ๊ณต๋ถ€ํ•˜๊ธฐ ,

  • greater ์ผ๋•Œ์™€ less์ผ๋•Œ์˜ ์ฐจ์ด์ .

๋ฐฐ์—ด์„ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์€ ํฌ์ธํ„ฐ๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•จ.

์ฝ”๋“œ

#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]);
		}
	}
}
profile
๐Ÿ”ฅ๐Ÿ”ฅ๐Ÿ”ฅ

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด