POJ - 1679 The Unique MST

 

 

代码如下:

 

#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<stack>
#include<cstring>
#include<queue>
using namespace std;
int f[105];

int get(int x)
{
    if(x == f[x]) return x;
    return f[x] = get(f[x]);
}

void merget(int x, int y)
{
    f[get(x)] = get(y);
}

struct edge
{
    int f, t, l;
    edge(){}
    edge(int ff, int tt, int ll){f = ff, t = tt, l = ll;}

    friend bool operator <(edge a, edge b)
    {
        return a.l < b.l;
    }
}e[10005 << 1];

int head[105], now;

void addEdge(int ff, int tt, int ll)
{
    e[now ++ ] = edge(ff, tt, ll);
}

int n, m, t;

int main(){
    
    scanf("%d", &t);

    while(t -- )
    {
        scanf("%d%d", &n, &m);

        for(int i = 0; i <= n; i ++ ) f[i] = i;
        memset(head, -1, sizeof head);
        now = 0;
        int ans = 0;
        bool extra = false;

        for(int i = 0; i < m; i ++ )
        {
            int ff, tt, ll;
            scanf("%d%d%d", &ff, &tt, &ll);
            if(ff != tt) addEdge(ff, tt, ll);
        }

        sort(e, e + now);

        for(int i = 0; i < now;)
        {
            int cur = i, conet1 = 0, conet2 = 0;

            if(! extra)
                while(cur < now && e[cur].l == e[i].l)
                {
                    if(get(e[cur].f) != get(e[cur].t)) conet1 ++ ;
                    cur ++ ;
                }

            cur = i;

            while(cur < now && e[cur].l == e[i].l)
            {
                if(get(e[cur].f) != get(e[cur].t))
                {
                    conet2 ++ ;
                    merget(e[cur].f, e[cur].t);
                    ans += e[cur].l;
                }
                cur ++ ;
            }

            if(conet1 != conet2) extra = true;

            i = cur;
            
        }

        if(extra) printf("Not Unique!\n");
        else printf("%d\n", ans);

    }

    

    system("pause");
    return 0;

}

 

 

 

posted @ 2022-07-08 17:26  ginkgozyf  阅读(13)  评论(0)    收藏  举报