두 번째로, 파란색 간선을 가장 많이 사용하는 경우를 보기 위해 파란색 간선으로만 스패닝 트리를 생성해본다.
이 때가 파란색 간선을 가장 많이 사용하는 경우이므로 최댓값은 5가 된다.
( 두 번째 단계를 진행할 때, 파란 간선을 모두 연결해도 스패닝 트리가 되지 않아도 상관 없다. )
이후 목표값이 이 범위 사이에 있다면 1, 그렇지 않다면 0을 출력해준다.
( 빨간 색 간선으로 바꿔주며 이 범위 내에 있는 파란 색 간선을 모두 표현할 수 있기 때문 )
cpp
코드 펼치기
#include<iostream>#include<vector>usingnamespace std;
int n, m, k;
int par[1001];
vector <pair <int, int>> v_r;
vector <pair <int, int>> v_b;
voidinit(int n){
for (int i = 1; i <= n; i++)
{
par[i] = i;
}
}
intfind(int x){
if (x == par[x]) return x;
elsereturn par[x] = find(par[x]);
}
booluni(int x, int y){
x = find(x);
y = find(y);
if (x == y) returnfalse;
else
{
par[x] = par[y] = min(x, y);
returntrue;
}
}
intmain(){
ios_base::sync_with_stdio(false);
cin.tie(0);
int x, y, mini, maxi;
string col;
while (1)
{
cin >> n >> m >> k;
if (n == 0 && m == 0 && k == 0) break;
mini = 0;
maxi = 0;
v_r.clear();
v_b.clear();
init(n);
for (int i = 0; i < m; i++)
{
cin >> col >> x >> y;
if (col == "R") v_r.push_back({ x, y });
else v_b.push_back({ x, y });
}
for (int i = 0; i < v_r.size(); i++)
{
uni(v_r[i].first, v_r[i].second);
}
for (int i = 0; i < v_b.size(); i++)
{
bool chk = uni(v_b[i].first, v_b[i].second);
if (chk) mini++;
}
init(n);
for (int i = 0; i < v_b.size(); i++)
{
if (uni(v_b[i].first, v_b[i].second)) maxi++;
}
if (mini <= k && k <= maxi) cout << 1 << "\n";
else cout << 0 << "\n";
}
}
java
코드 펼치기
import java.util.*;
import java.io.*;
publicclassMain{
static List<int[]> v_r = new ArrayList<>();
static List<int[]> v_b = new ArrayList<>();
staticint[] par = newint[1001];
staticvoidinitPar(int n){
for(int i=1; i<=n; i++)
{
par[i] = i;
}
}
staticintfind(int x){
if(x == par[x]) return x;
elsereturn par[x] = find(par[x]);
}
staticbooleanuni(int x, int y){
x = find(x);
y = find(y);
if(x == y) returnfalse;
else
{
par[x] = par[y] = Math.min(x, y);
returntrue;
}
}
staticpublicvoidmain(String[] agrs)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader (System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
int n, m, k, mini, maxi;
while(true)
{
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
if(n == 0 && m == 0 && k == 0) break;
mini = 0;
maxi = 0;
for(int i=0; i<m; i++)
{
st = new StringTokenizer(br.readLine());
if(st.nextToken().equals("B"))
{
int[] arr = {Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())};
v_b.add(arr);
}
else
{
int[] arr = {Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())};
v_r.add(arr);
}
}
initPar(n);
for(int i=0; i<v_r.size(); i++)
{
uni(v_r.get(i)[0], v_r.get(i)[1]);
}
for(int i=0; i<v_b.size(); i++)
{
if(uni(v_b.get(i)[0], v_b.get(i)[1])) mini++;
}
initPar(n);
for(int i=0; i<v_b.size(); i++)
{
if(uni(v_b.get(i)[0], v_b.get(i)[1])) maxi++;
}
if(mini <= k && k <= maxi) sb.append(1).append("\n");
else sb.append(0).append("\n");
v_r.clear();
v_b.clear();
}
System.out.println(sb);
}
}