UVALive 6807(最大生成树)

来源:互联网 发布:网络教学有什么特点 编辑:程序博客网 时间:2024/06/06 10:04

解题思路:求最大生成树, 不在最大生成树上的边即为所求。

#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);    }}


0 0