
플로이드워셜 알고리즘 연습 중이다.
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;
}