POJ

来源:互联网 发布:mac pro 魔兽世界 编辑:程序博客网 时间:2024/06/05 07:20

次小生成树
次小生成树和最小生成树相等就输出英文balabala

#include<iostream>#include<cmath>#include<string>#include<algorithm>#include<vector>#include<stdio.h>#include<map>#include<queue>#include<climits>#include<stdlib.h>#include<iomanip>#include<string.h>#include<cstring>using namespace std;/*********************************************/#define N 50000+5#define R (rt<<1|1)#define L (rt<<1)#define lson l,mid,L#define rson mid+1,r,R#define mid (l+r)/2#define INF 0x3f3f3f3f#define mem(arr,a) memset(arr,a,sizeof(arr))#define LL long long int#define sd1(a) scanf("%d",&a)#define sd2(a,b) scanf("%d%d",&a,&b)#define sd3(a,b,c) scanf("%d%d%d",&a,&b,&c)#define pd1(a) printf("%d",a)#define pd2(a,b) printf("%d%d",a,b)/**********************************************/struct edge{    int u, v, w;    int del, equal, used;};edge es[N];bool cmp(edge a, edge b){    return a.w < b.w;}int t, n, m;bool flag;int par[N];int find(int x){    if (x == par[x])return x;    return par[x] = find(par[x]);}int kruskal(){    int sum = 0;    int cnt = 0;    for (int i = 1; i <= n; i++)par[i] = i;    for (int i = 1; i <= m; i++){        if (es[i].del)continue;        int u = es[i].u;        int v = es[i].v;        int w = es[i].w;        u = find(u);        v = find(v);        if (u != v){            par[u] = v;            sum += w;            if (flag)es[i].used = 1;            cnt++;            if (cnt >= n - 1)                break;        }    }    return sum;}int main(){    cin >> t;    while (t--){        cin >> n >> m;        for (int i = 1; i <= m; i++){            cin >> es[i].u >> es[i].v >> es[i].w;            es[i].del = es[i].equal = es[i].used = 0;        }        for (int i = 1; i <= m; i++){            for (int j = 1; j <= m; j++){                if (i == j)continue;                if (es[i].w == es[j].w)es[i].equal = 1;            }        }        sort(es + 1, es + 1 + m, cmp);        flag = true;        int first = kruskal();        flag = false;        int mark = 0;        for (int i = 1; i <= m; i++){            if (es[i].equal&&es[i].used){                es[i].del = 1;                int second = kruskal();                if (second == first){                    printf("Not Unique!\n");                    mark = 1;                    break;                }                es[i].del = 0;            }        }        if (!mark)printf("%d\n", first);    }}
原创粉丝点击