#define _DE321BUG
#include <bits/stdc++.h>
using namespace std;
#define endl "\n"
#define fi first
#define se second
#define all(x) (x).begin(),(x).end()
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<pii> vii;
const long double pi = acos(-1.0);
const int INF = 1987654321;
const ll LLINF = 4e18;
const double eps = 1e-9;
template<class T>bool chmax(T& a, const T& b) { if (a < b) { a = b; return 1; } return 0; }
template<class T>bool chmin(T& a, const T& b) { if (b < a) { a = b; return 1; } return 0; }
//
int parent[10002][1002]; // kid/vertice
int find(int kid, int n){
if(parent[kid][n] == -1) return n;
return parent[kid][n] = find(kid, parent[kid][n]);
}
void merge(int kid, int u, int v){
u = find(kid, u);
v = find(kid, v);
if(u == v) return;
parent[kid][v] = u;
}
struct Edge{
int idx, u, v, weight;
// bool operator<(const Edge &other) const{
// return weight < other.weight;
// }
bool operator<(const Edge &other) const{
return weight > other.weight;
}
};
vector<Edge> edges;
int main(){
#ifdef _DEBUG
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(NULL);
memset(parent, -1, sizeof(parent));
int N, M, K; cin >> N >> M >> K;
// if(K > 10){
// return 0;
// }
for(int i = 1; i <= M; i++){
int a, b, c; cin >> a >> b >> c;
edges.push_back({i, a, b, c});
}
sort(edges.begin(), edges.end());
// for(auto v : edges){
// cout << v.idx << " " << v.u << " " << v.v << " " << v.weight << endl;
// }
int ans[300004];
memset(ans, 0, sizeof(ans));
for(auto edge : edges){
// for(int i = 1; i <= K; i++){
// if(find(i, edge.u) == find(i, edge.v)) continue;
// merge(i, find(i, edge.u), find(i, edge.v));
// ans[edge.idx] = i;
// break;
// }
bool flag = false;
int lo = 0;
int hi = K;
while(lo + 1 < hi){
int mid = (lo + hi)/2;
if(find(mid, edge.u) != find(mid, edge.v)){
hi = mid;
flag = true;
}
else{
lo = mid;
}
}
// cout << edge.idx << " " << hi << " " << flag << endl;
if(find(hi, edge.u) != find(hi, edge.v)){
merge(hi, find(hi, edge.u), find(hi, edge.v));
ans[edge.idx] = hi;
}
else{
ans[edge.idx] = 0;
}
// if(flag) ans[edge.idx] = K-hi;
// if(flag) ans[edge.idx] = hi;
// else ans[edge.idx] = 0;
}
for(int i = 1; i <= M; i++) cout << ans[i] << endl;
return 0;
}
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.