解题思路:求最大生成树, 不在最大生成树上的边即为所求。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct tt{
int from;
int to;
int w;
bool operator <(tt p1) const{
return w > p1.w;
}
}a[100010];
int p[10010];
int vis[100010];
int find(int x){
return x == p[x] ? x : p[x] = find(p[x]);
}
int main(){
int T, kase = 0;
scanf("%d", &T);
while(T--){
int n, m;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) p[i] = i;
for(int i = 1; i <= m; i++){
scanf("%d%d%d", &a[i].from, &a[i].to, &a[i].w);
}
sort(a + 1, a + m + 1);
memset(vis, 0, sizeof vis);
int cnt = n;
for(int i = 1; i <= m; i++){
int t1 = find(a[i].from);
int t2 = find(a[i].to);
if(t1 != t2){
p[t1] = t2;
vis[i] = 1;
if(--cnt == 1) break;
}
}
int ans = 0, maxx = 0;
for(int i = 1; i <= m; i++){
if(!vis[i]){
ans += a[i].w;
maxx = max(a[i].w, maxx);
}
}
printf("Case #%d: %d %d\n", ++kase, ans, maxx);
}
}