LightOJ 1123 - Trail Maintenance (最小生成树)

题意:有n个点,依次给出m条边。每一次判断能否形成最小生成树,输出最小生成树。

最近没有写代码,脑子短路了。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#include <stack>
#include <map>

using namespace std;
const int N = 209;
struct LINE{
    int l,r,dis;
    bool operator<(const LINE t)const{
        return dis<t.dis;
    }
} L[N];
int n,m,cnt;
int fa[N];
int find_fa(int k)
{
    if(fa[k]==k) return k;
    return fa[k] = find_fa(fa[k]);
}
int solve()
{
    int d = -1,l,r,ret=0,coun=1;
    for(int i=0;i<=n;i++) fa[i] = i;
    for(int i=0;i<cnt;i++)
    {
        l = find_fa(L[i].l),r = find_fa(L[i].r);
        if(l==r)
        {
            d = i;continue;
        }
        fa[l] = r;
        coun++;
        ret+=L[i].dis;
    }
    if(d!=-1) L[d] = L[--cnt];
    if(coun==n) return ret;
    return -1;
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif
    int cas,T=1;
    scanf("%d",&cas);
    while(cas--)
    {
        scanf("%d%d",&n,&m);
        cnt = 0;
        printf("Case %d:\n",T++);
        int a,b,c;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            L[cnt].l = a,L[cnt].r = b,L[cnt].dis = c;
            cnt++;
            sort(L,L+cnt);
            printf("%d\n",solve());
        }
    }
    return 0;
}



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