백준 2660 c++

magicdrill·2024년 10월 15일

백준 문제풀이

목록 보기
464/673

백준 2660 c++

플로이드워셜 알고리즘 연습 중이다.
2458번 문제처럼 연관관계만 필요한 경우 bool 벡터로 충분하겠지만, 최소비용이 필요하면 int 벡터로 생성해야 한다.
최소비용이니까 BFS도 가능한거 같다...

#include <iostream>
#include <vector>
#define MAX 52

using namespace std;

void input_data(vector<vector<int>>& relation)
{
	cout << "input_data()\n";
	int N;
	int a, b;

	cin >> N;
	relation.resize(N + 1, vector<int>(N + 1, MAX));//N+1 * N+1 크기의 2차원 벡터를 false로 초기화
	while (true)
	{
		cin >> a >> b;
		if (a == -1 && b == -1)
		{
			break;
		}
		relation[a][b] = 1;
		relation[b][a] = 1;
	}
	//자기 자신을 친구로 삼는거 초기화
	for (int i = 1; i < relation.size(); i++)
	{
		relation[i][i] = 0;
	}

	cout << "입력결과\n";
	for (int i = 1; i < relation.size(); i++)
	{
		for (int j = 1; j < relation[i].size(); j++)
		{
			cout << relation[i][j] << " ";
		}
		cout << "\n";
	}
	cout << "\n";

	return;
}

void find_answer(vector<vector<int>>& relation)
{
	cout << "find_answer()\n";
	int i, j, k;
	//점수가 낮을수록 회장 후보
	//회장 후보의 점수, 후보의 수
	//회장 후보 오름차순
	int min_score = MAX, count = 0;//회장 후보 점수, 후보 수
	vector<int> prime_candidate;
	int temp;

	cout << "플로이드 워셜 순회\n";
	for (k = 1; k < relation.size(); k++)
	{
		for (i = 1; i < relation.size(); i++)
		{
			for (j = 1; j < relation.size(); j++)
			{
				relation[i][j] = min(relation[i][j], relation[i][k] + relation[k][j]);
			}
		}
	}

	cout << "플로이드 워셜 순회 결과\n";
	//요소값의 의미는 i와 j가 친구이려면 필요한 연결의 수
	cout << "요소값의 의미는 i와 j가 친구이려면 필요한 연결의 수\n";
	for (i = 1; i < relation.size(); i++)
	{
		for (j = 1; j < relation[i].size(); j++)
		{
			cout << relation[i][j] << " ";
		}
		cout << "\n";
	}

	//플로이드 워셜 순회 결과 각 행당 최대 값 확인
	for (i = 1; i < relation.size(); i++)
	{
		temp = 0;

		for (j = 1; j < relation[i].size(); j++)//최대 점수 찾기
		{
			temp = max(relation[i][j], temp);
		}

		if (temp < min_score)//점수를 갱신한다면 기존 후보 지우고 후보 갱신
		{
			prime_candidate.clear();
			prime_candidate.push_back(i);//후보에 추가
			min_score = temp;
		}
		else if (temp == min_score)//점수가 동일하다면 후보에 추가
		{
			prime_candidate.push_back(i);//후보에 추가
		}
		else//점수가 더 크면 후보가 안됨
		{
			;
		}
	}
	cout << min_score << " " << prime_candidate.size() << "\n";
	for (int num : prime_candidate)//어차피 i = 1부터 찾으니까 오름차순 정렬이 필요 없음
	{
		cout << num << " ";
	}
	cout << "\n";

	return;
}

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	vector<vector<int>> relation;//연결관계만 확인하면 됨?
	//모두가 친구로 연결되면? 아닌거 같은데

	input_data(relation);
	find_answer(relation);

	return 0;
}

0개의 댓글