This repository was archived by the owner on Feb 22, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathp2.cpp
More file actions
116 lines (95 loc) · 2.85 KB
/
p2.cpp
File metadata and controls
116 lines (95 loc) · 2.85 KB
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
115
116
#include <iostream>
#include <vector>
#include <queue>
#include <unordered_set>
using namespace std;
int minLines(const vector<unordered_set<int>> &graph, int num_lines, int starting_line, int ending_line) {
queue<int> q;
q.push(starting_line);
int changes = 0;
vector<int> visited(num_lines, 0);
visited[starting_line] = 1;
while (!q.empty()) {
int size = q.size();
for (int i = 0; i < size; ++i) {
int current_line = q.front();
q.pop();
if (current_line == ending_line) {
return changes;
}
for (int connected_line : graph[current_line]) {
if (!visited[connected_line]) {
visited[connected_line] = 1;
q.push(connected_line);
}
}
}
++changes;
}
return -1;
}
int main() {
std::ios::sync_with_stdio(0);
std::cin.tie(0);
int num_stations, num_ligacoes, num_lines;
cin >> num_stations >> num_ligacoes >> num_lines;
vector<unordered_set<int>> station_lines(num_stations);
vector<unordered_set<int>> line_connections(num_lines);
vector<int> aux(num_ligacoes); // para keep track se uma linha conecta todas as stations
for (int i = 0; i < num_ligacoes; ++i) {
int x, y, z;
cin >> x >> y >> z;
--x; --y; --z;
aux[z]++;
for (int line : station_lines[x]) {
if (line != z) {
line_connections[line].insert(z);
line_connections[z].insert(line);
}
}
for (int line : station_lines[y]) {
if (line != z) {
line_connections[line].insert(z);
line_connections[z].insert(line);
}
}
station_lines[x].insert(z);
station_lines[y].insert(z);
}
if(num_stations == 1 && (num_lines == 1 || num_lines == 0)){
cout << 0 << endl;
return 0;
}
for(int i = 0; i < num_stations; ++i){
if(station_lines[i].empty()){
cout << -1 << endl;
return 0;
}
}
for(int i = 0; i < num_lines; ++i){
if(aux[i]>= num_stations - 1){
cout << 0 << endl;
return 0;
}
}
//BFS
int max = 0;
for(int i = 0; i < num_lines; ++i){
for(int j = i+1; j < num_lines; ++j) {
int min = minLines(line_connections, num_lines, i, j);
if(min == -1){
cout << -1 << endl;
return 0;
}
if(min > max){
max = min;
if(max >= num_lines - 1){
cout << max << endl;
return 0;
}
}
}
}
cout << max << endl;
return 0;
}