문제링크 : https://www.acmicpc.net/problem/2610
2610번: 회의준비
첫째 중에 회의에 참석하는 사람의 수 N이 주어진다. 참석자들은 1부터 N까지의 자연수로 표현되며 회의에 참석하는 인원은 100 이하이다. 둘째 줄에는 서로 알고 있는 관계의 수 M이 주어진다. 이어 M개의 각 줄에는 서로 아는 사이인 참석자를 나타내는 두개의 자연수가 주어진다.
www.acmicpc.net


문제 설명
1. 회의 에참석하는 사람의수 N, 서로알고있는 관계의수 M이 주어짐.
2. 서로 알고있는 사이 일때 의사를 전달 할수있음 ,서로 알고있는 사이는 무조건 같은 위원회에 소속.
3. 위원회의 대표를 뽑을때 의사전달시간 최대가 최소가 되는 사람이 되어야함.
4. 위원회 수와 대표번호를 오름차순으로 출력
알고리즘
1. BFS알고리즘으로 각 위원회를 묶어준다.
2. 각각 위원회에서 의사전달 시간을 구한다.
3. 대표를 선출 한다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
int N, M, arr[101][101], chk[101][101];
int check[101];
//컴포넌트 구하기
void bfs(int n, int num) {
queue<int> q;
q.push(n);
check[n] = num;
while (!q.empty()) {
int x = q.front();
q.pop();
for (int i = 1; i <= N; i++) {
if (chk[x][i] && !check[i]) {
q.push(i);
check[i] = num;
}
}
}
}
int main() {
cin.tie(NULL);
ios::sync_with_stdio(false);
cin >> N >> M;
//배열 초기화
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
arr[i][j] = 987654321;
chk[i][j] = 0;
}
}
for (int i = 0; i < M; i++) {
int a, b;
cin >> a >> b;
//컴포넌트를 구하기위해 배열을 두개만듦 상당히 비효율적 ㅠ
arr[a][b] = 1;
arr[b][a] = 1;
chk[a][b] = 1;
chk[b][a] = 1;
}
int cnt = 0;
//컴포넌트를 구해서 지정
for (int i = 1; i <= N; i++) {
if (!check[i]) {
cnt++;
bfs(i, cnt);
}
}
//플루이드 와샬
for (int k = 1; k <= N; k++) {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
arr[i][j] = min(arr[i][j], arr[i][k] + arr[k][j]);
}
}
}
int max_ans[101];
for (int i = 0; i < 101; i++)max_ans[i] = 0;
//각 인원마다 걸리는 의사전달시간 구하기.
for (int k = 1; k <= cnt; k++) {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (i == j)continue;
if (check[i] == k) {
if (check[j] == k)
max_ans[i] = max(max_ans[i], arr[i][j]);
}
}
}
}
cout << cnt<<"\n";
vector<int> ans;
//각 컴포넌트(위원회) 의 대표 구하기.
for (int i = 1; i <= cnt; i++) {
pair<int, int> result =make_pair(0, 987654321);
for (int j = 1; j <= N; j++) {
if (check[j] == i) {
result = make_pair(j, max_ans[j]);
}
}
}
ans.push_back(result.first);
}
//대표 오름차순 정렬
sort(ans.begin(),ans.end());
//대표 출력
for (int i = 0; i < ans.size(); i++)
cout << ans[i] << "\n";
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
문제링크 : https://www.acmicpc.net/problem/2610
2610번: 회의준비
첫째 중에 회의에 참석하는 사람의 수 N이 주어진다. 참석자들은 1부터 N까지의 자연수로 표현되며 회의에 참석하는 인원은 100 이하이다. 둘째 줄에는 서로 알고 있는 관계의 수 M이 주어진다. 이어 M개의 각 줄에는 서로 아는 사이인 참석자를 나타내는 두개의 자연수가 주어진다.
www.acmicpc.net


문제 설명
1. 회의 에참석하는 사람의수 N, 서로알고있는 관계의수 M이 주어짐.
2. 서로 알고있는 사이 일때 의사를 전달 할수있음 ,서로 알고있는 사이는 무조건 같은 위원회에 소속.
3. 위원회의 대표를 뽑을때 의사전달시간 최대가 최소가 되는 사람이 되어야함.
4. 위원회 수와 대표번호를 오름차순으로 출력
알고리즘
1. BFS알고리즘으로 각 위원회를 묶어준다.
2. 각각 위원회에서 의사전달 시간을 구한다.
3. 대표를 선출 한다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
int N, M, arr[101][101], chk[101][101];
int check[101];
//컴포넌트 구하기
void bfs(int n, int num) {
queue<int> q;
q.push(n);
check[n] = num;
while (!q.empty()) {
int x = q.front();
q.pop();
for (int i = 1; i <= N; i++) {
if (chk[x][i] && !check[i]) {
q.push(i);
check[i] = num;
}
}
}
}
int main() {
cin.tie(NULL);
ios::sync_with_stdio(false);
cin >> N >> M;
//배열 초기화
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
arr[i][j] = 987654321;
chk[i][j] = 0;
}
}
for (int i = 0; i < M; i++) {
int a, b;
cin >> a >> b;
//컴포넌트를 구하기위해 배열을 두개만듦 상당히 비효율적 ㅠ
arr[a][b] = 1;
arr[b][a] = 1;
chk[a][b] = 1;
chk[b][a] = 1;
}
int cnt = 0;
//컴포넌트를 구해서 지정
for (int i = 1; i <= N; i++) {
if (!check[i]) {
cnt++;
bfs(i, cnt);
}
}
//플루이드 와샬
for (int k = 1; k <= N; k++) {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
arr[i][j] = min(arr[i][j], arr[i][k] + arr[k][j]);
}
}
}
int max_ans[101];
for (int i = 0; i < 101; i++)max_ans[i] = 0;
//각 인원마다 걸리는 의사전달시간 구하기.
for (int k = 1; k <= cnt; k++) {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (i == j)continue;
if (check[i] == k) {
if (check[j] == k)
max_ans[i] = max(max_ans[i], arr[i][j]);
}
}
}
}
cout << cnt<<"\n";
vector<int> ans;
//각 컴포넌트(위원회) 의 대표 구하기.
for (int i = 1; i <= cnt; i++) {
pair<int, int> result =make_pair(0, 987654321);
for (int j = 1; j <= N; j++) {
if (check[j] == i) {
result = make_pair(j, max_ans[j]);
}
}
}
ans.push_back(result.first);
}
//대표 오름차순 정렬
sort(ans.begin(),ans.end());
//대표 출력
for (int i = 0; i < ans.size(); i++)
cout << ans[i] << "\n";
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|