無向圖,邊有權值。每個連通塊大小有「喜愛度」。保留邊權在某區間 [L, R] 內的邊,求使總喜愛度 ≥ k 的最小區間長度 R-L。
n ≤ 1000, m ≤ 5000。
struct Edge { int u, v, w; };
bool cmp(Edge a, Edge b) { return a.w < b.w; }
int fa[N], sz[N];
long long sum, w[N];
int find(int x) { return fa[x]==x ? x : fa[x]=find(fa[x]); }
void unite(int x, int y) {
x = find(x); y = find(y);
if (x == y) return;
if (sz[x] > sz[y]) swap(x, y);
sum -= w[sz[x]] + w[sz[y]];
fa[x] = y; sz[y] += sz[x];
sum += w[sz[y]];
}
int main() {
int n, m, k;
while (cin >> n >> m >> k) {
for (int i = 1; i <= n; i++) cin >> w[i];
vector edges(m);
for (auto& e : edges) cin >> e.u >> e.v >> e.w;
sort(edges.begin(), edges.end(), cmp);
int ans = INT_MAX;
for (int i = 0; i < m; i++) {
if (i > 0 && edges[i].w == edges[i-1].w) continue; // 優化:相同權值左端點只需最左
for (int j = 1; j <= n; j++) { fa[j] = j; sz[j] = 1; }
sum = 1LL * n * w[1];
for (int j = i; j < m; j++) {
unite(edges[j].u, edges[j].v);
if (j+1 == m || edges[j].w != edges[j+1].w) { // 權值變化時檢查
if (sum >= k) {
ans = min(ans, edges[j].w - edges[i].w);
break;
}
}
}
}
if (ans == INT_MAX) cout << "T_T\n";
else cout << ans << "\n";
}
}