Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdio.h>
- #include <vector>
- #include <queue>
- #include <cstring>
- using namespace std;
- int n, m, from, to, tmp;
- vector<pair<int, int>> v[100001];
- bool visited[100001];
- bool dfs(int node, int mid) {
- if (visited[node]) //이미 방문한적있으면 false return함
- return false;
- visited[node] = true;
- if (node == to)//도착점에 도착하면 true return함
- return true;
- for (int i = 0; i < v[node].size(); i++) {
- int next = v[node][i].first;
- int cost = v[node][i].second;
- if (cost >= mid) {
- if (dfs(next, mid)) { // 계속 dfs타고 들어가서
- return true;
- }
- }
- }
- return false; //끝까지 도착점 도착 못하면 ㅂㅂ
- }
- bool bfs(int mid) {
- queue<int> q;
- q.push(from);
- visited[from] = true;
- while (!q.empty()) {
- int x = q.front();
- if (x == to) //섬에 도착
- return true; //끝내기
- q.pop();
- for (int i = 0; i < v[x].size(); i++) {
- int next = v[x][i].first;
- int weight = v[x][i].second;
- if (visited[next] == 0 && weight >= mid) {
- q.push(next);
- visited[next] = true;
- }
- }
- }
- return false;
- }
- int main() {
- scanf("%d %d", &n, &m);
- int left = 1, right = 0;
- for (int i = 0; i < m; i++) {
- scanf("%d %d %d", &from, &to, &tmp);
- v[from].push_back(make_pair(to, tmp));
- v[to].push_back(make_pair(from, tmp));
- if (right < tmp) {
- right = tmp;
- }
- }
- scanf("%d %d", &from, &to);
- int mid, ans = 0;
- while (left <= right) {
- memset(visited, false, sizeof(visited));
- mid = left - (left - right) / 2;
- /*bfs일 경우
- if (bfs(mid)) {
- left = mid + 1;
- ans = mid;
- }
- */
- //dfs일 경우
- if (dfs(from, mid)) {
- left = mid + 1;
- ans = mid;
- }
- else {
- right = mid - 1;
- }
- }
- printf("%d\n", ans);
- return 0;
- }
Add Comment
Please, Sign In to add comment