본문 바로가기
CS

다익스트라 c++

by ddanss 2023. 4. 3.
728x90

하나의 시작점으로부터 다른 정점들까지의 최단거리를 구하는 알고리즘

O(ElgE)

 

1753

순서

1. 거리 무한으로 해놓고

2. 정점들 연결해주고

3. 초기값 넣어주고

4. 거리값이 최소값인지 확인하고

5. 최단거리테이블 값과 현재 정점을 거쳐가는 값을 비교

 

int v, edges, start;
vector<pair<int, int>> adj[20005]; //거리, 정점
int d[20005];

int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int a, b, c;
	cin >> v >> edges >> start;
	fill(d, d + v + 1, 12345678);
	for (int i = 0; i < edges; i++) {
		cin >> a >> b >> c;
		adj[a].push_back({ c,b }); //first : 거리, second : 정점
	}

	priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
	d[start] = 0;
	pq.push({ d[start], start }); //우선순위 큐에 (0, 시작점) 추가

	while (!pq.empty()) {
		auto cur = pq.top(); //우선순위큐에서 거리가 가장 작은 원소를 선택하고
		pq.pop();
		if (d[cur.second] != cur.first) continue; //거리가 최소값이 아닌경우
		for (auto repe : adj[cur.second]) { //현재 정점이 가리키는 정점들에 대해
			//최단거리 테이블 값에 있는게 cur을 거쳐가는것보다 더 작은 값이면 continue;
			if (d[repe.second] <= d[cur.second] + repe.first) continue; 
			//최단거리 테이블 값보다 cur을 거쳐가는게 더 작은 값이면
			d[repe.second] = d[cur.second] + repe.first; //거리 저장하고
			pq.push({ d[repe.second], repe.second }); //큐에넣기
		}
	}

	for (int i = 1; i <= v; i++) {
		if (d[i] == 12345678) cout << "INF\n";
		else cout << d[i] << '\n';
	}
}
반응형

'CS' 카테고리의 다른 글

매개변수탐색  (0) 2023.04.10
이분탐색  (0) 2023.04.09
플로이드 와샬  (0) 2023.03.02
투포인터  (0) 2023.02.22
백트래킹  (0) 2023.02.21

댓글