[1039] 중량 제한, c++

2021. 2. 6. 23:38·DEV/PS

[1039] 중량제한

https://www.acmicpc.net/problem/1939

 

1939번: 중량제한

첫째 줄에 N, M(1≤M≤100,000)이 주어진다. 다음 M개의 줄에는 다리에 대한 정보를 나타내는 세 정수 A, B(1≤A, B≤N), C(1≤C≤1,000,000,000)가 주어진다. 이는 A번 섬과 B번 섬 사이에 중량제한이 C인 다리

www.acmicpc.net

한줄 후기 : 옛날에 열심히 했었네..

 

#include <iostream>
#include <vector>
#include <cstring>
#include <utility>
#include <algorithm>
using namespace std;
vector<pair<int,int> > island[10001];
int n, m, x, y;
bool visit[10001] = {false};
int dfs(int mid, int x){
	visit[x] = true;
	for(int i=0; i<island[x].size(); i++){
		if(visit[island[x][i].first] || island[x][i].second < mid){
			continue;
		}
		dfs(mid, island[x][i].first);
	}
	return visit[y];
}
int main(){
	int a,b,c;
	int l=0,r=0,mid, ans=1;
	scanf("%d %d", &n, &m);
	//memset(island, -1, sizeof(island));
	for(int i=0; i<m; i++){
		scanf("%d %d %d", &a,&b,&c);
		island[a].push_back(make_pair(b,c));
		island[b].push_back(make_pair(a,c));
		r = max(r,c);
	}
	scanf("%d %d", &x, &y);
	while(l<=r){
		mid=(l+r)/2;
		memset(visit,false,sizeof(visit));
		if(dfs(mid,x)){
			l = mid+1;
			ans=max(ans,mid);
		}
		else	r = mid-1;
	}
	printf("%d", ans);
	return 0;
}

1번 시도에 통과는 했는데 엄청 어려웠던 것 같음

문제가 어렵기 보다는 코드 짜는게 까다로운?? 무튼 대충 문제는 여러개의 섬을 연결하는 양방향 가중 그래프에서 주어진 공장 사이를 한번에 오갈

수 있는 무게를 출력해주면된다. 즉, 다리의 무게를 넘는 물건은 옮길 수 없다.

옮길 무게 기준을 이분 탐색으로 정해주면 된다. 그리고 나머지는 그래프이기 때문에 그 무게를 가지고 dfs 를 돈다.

​

1. 마지막에 내가 도착해야할 공장의 visit 배열이 true 라면 -> 그 무게로 다리를 건널 수 있음 이니까 다음 mid(l = mid + 1) 로 다시 돌아준다.

2. visit 이 false 라면 -> 그 무게를 가지고 내가 갈 공장에 도착 할 수 없음 그러니까 mid를 더 작게 해준다. (r = mid - 1)

​

이때 중요한 건 다른 그래프 문제랑 은 다르게 visit 배열은 항상 한번 dfs를 돌면 초기화 해줘야 한다. 왜냐면 다른 무게로 또 그 공장에 방문해야 하니까~

저작자표시 (새창열림)

'DEV > PS' 카테고리의 다른 글

[17241] Pineapple Advertising, c++  (0) 2021.02.06
[1699] 제곱수의 합, c++  (0) 2021.02.06
[19542] 전단지 돌리기 - UCPC 2020 본선 A번, c++  (0) 2021.02.04
[5582] 공통 부분 문자열, c++  (0) 2021.02.04
[6448] Stockbroker Grapevine, c++  (0) 2021.02.04
'DEV/PS' 카테고리의 다른 글
  • [17241] Pineapple Advertising, c++
  • [1699] 제곱수의 합, c++
  • [19542] 전단지 돌리기 - UCPC 2020 본선 A번, c++
  • [5582] 공통 부분 문자열, c++
jobchae
jobchae
말하는 감자지만, 코드를 끄적이는 Node.js 백엔드 개발자입니다.
  • jobchae
    JOBCHAE
    jobchae
  • 전체
    오늘
    어제
    • 🚀 JOBCHAE (182)
      • DEV (151)
        • PS (108)
        • Node.js (12)
        • React (3)
        • docker (1)
        • 잡다한 개발 일지 (21)
        • injection (1)
        • JS, TS (3)
        • DB (2)
      • 축구 (0)
      • 일상 (19)
      • 영화 (3)
      • 음악 (8)
  • 블로그 메뉴

    • 💻 Github
    • 🙋🏻 Linkedin
    • 📖 방명록
  • 링크

    • PS Github
  • 공지사항

  • 인기 글

  • 태그

    GitHub
    nodejs
    일상
    react
    Nest.js
    위상정렬
    BFS
    Express
    회고
    typescript
    JavaScript
    솝트
    boj
    SOPT
    백준
    DP
    db
    슬랙
    이분탐색
    PS
    렛츠락페스티벌
    슬랙봇
    개발
    리액트
    우선순위큐
    알고리즘
    mongoDB
    DFS
    앱잼
    node.js
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
jobchae
[1039] 중량 제한, c++
상단으로

티스토리툴바