UVALive 6807 TÚNEL DE RATA

题目PDF
题意:要求选一些边,图中每一个环都至少有一条边被选中,要让所选的边的权值和最小。
题解:求出最大生成树,把不在最大生成树上的边都选中, 这样可以保证得到最优解。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;


const int maxn = 100010;
const int maxm = 100010;
struct EE
{
    int u,v,w;
    bool operator<(const EE &b) const {
        return w > b.w;
    }
}e[maxm];
int fa[maxn];
int find(int u)
{
    if (fa[u] == u) return u;
    return fa[u] = find(fa[u]);
}
int main()
{
    int T;
    int cas = 1;
    scanf("%d",&T);
    while (T--) {
        int n,m;
        scanf("%d%d",&n,&m);
        for (int i = 1; i <= n; i++) fa[i] = i;
        for (int i = 0; i < m; i++) {
            scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);
        }
        sort(e,e + m);
        int ans1,ans2;
        ans1 = 0;
        ans2 = -1;
        for (int i = 0; i < m; i++) {
            int a = find(e[i].u);
            int b = find(e[i].v);
            if (a == b) {
                ans1 += e[i].w;
                if (ans2 == -1)
                    ans2 = e[i].w;
            }
            else
                fa[find(a)] = b;
        }
        printf("Case #%d: %d %d\n",cas++,ans1,ans2);
    }
}

你可能感兴趣的:(图论,生成树,最大生成树)