답안 #747522

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
747522 2023-05-24T08:58:07 Z vjudge1 자매 도시 (APIO20_swap) C++17
0 / 100
1 ms 296 KB
#include "swap.h"

#include <bits/stdc++.h>

using namespace std;

struct edge {
    int to, w;
};

int n, m;
vector<vector<edge>> v;

vector<bool> benne, seen;

bool dfs(int x, int d, int a, bool elso = true){
    if(x == d) return true;
    if(seen[x])return false;
    if(benne[x])return false; // a masodik futashoz
    seen[x] = true;
    for(edge&i:v[x]){
        if(i.w>a)continue;
        if(elso && i.to == d)continue;
        if(dfs(i.to, d, a, false)){
            benne[x] = true;
            return true;
        }
    }
    return false;
}

bool dfs2(int x, int a){ // TODO: meg kell csinálni
    if (benne[x] || seen[x]) return false;
    seen[x] = true;
    int szam = 0;
    for (edge&i:v[x]){
        if (i.w > a || benne[i.to]) continue;
        szam++;
        if (dfs2(i.to, a)) return true;
    }
    if (szam >= 3) return true;
    return false;
}

bool jo(int a, int x, int y){
    benne.assign(n, 0);
    seen.assign(n, 0);
    bool talaltelso = dfs(x, y, a);
    benne[x] = benne[y] = false;
    bool kozvetlen = false;
    for(edge&i:v[x]){
        if(i.to == y && i.w <= a){
            kozvetlen = true;
            if(talaltelso) return true;
        }
    }
    if(talaltelso){
        seen.assign(n, 0);
        if(dfs(x, y, a))return true;
        benne[x] = benne[y] = false;
    } else if(!kozvetlen) {
        return false;
    }
    for(int i = 0; i < n; i++){
        if(!benne[i])continue;
        for(edge&j:v[i]){
            if(j.w <= a && !benne[j.to]){
                return true;
            }
        }
    }
    seen.assign(n, false);
    if(dfs2(x, a)) return true;
    seen.assign(n, false);
    if(dfs2(y, a)) return true;
    return false;
}

void init(int N, int M,
    std::vector<int> U, std::vector<int> V, std::vector<int> W) {
    n = N, m = M;
    v.assign(n, {});
    for(int i = 0; i < M; i++){
        v[U[i]].push_back({V[i], W[i]});
        v[V[i]].push_back({U[i], W[i]});
    }
}

int getMinimumFuelCapacity(int X, int Y) {
    int l = 0, r = 1e9+1;
    while(l < r){
        int m = (l+r)/2;
        if(jo(m, X, Y)){
            r = m;
        } else {
            l = m+1;
        }
    }
    return l == 1e9+1 ? -1 : l;
}

/*

6 5
0 1 1
1 2 2
2 3 4
2 4 3
3 5 5
5
0 5
0 3
1 5
4 3
2 4



6 5
0 1 1
1 2 2
2 3 4
2 4 3
3 5 5
1
0 5

*/

/*

4 3
0 1 1
0 2 2
0 3 3
4
1 2
1 3
0 1
3 0

*/

/*

4 4
0 1 3
1 2 5
2 3 7
3 0 4
3
1 3
0 2
0 1
*/

# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 296 KB Output is correct
2 Incorrect 1 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 296 KB Output is correct
2 Incorrect 1 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 296 KB Output is correct
2 Incorrect 1 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 296 KB Output is correct
2 Incorrect 1 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 296 KB Output is correct
2 Incorrect 1 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 296 KB Output is correct
2 Incorrect 1 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -