SDKD Summer Team Contest S

来源:互联网 发布:淘宝商城童装毛衣女孩 编辑:程序博客网 时间:2024/06/04 18:15

F:点击打开链接

最小生成树;

#include<cstdio>#include<iostream>#include<string.h>#include<cstring>#include<algorithm>#include<vector>#include<set>using namespace std;const int maxn = 1e5 + 100;int p[maxn];int r[maxn];int F[maxn];struct node{    int u, v, c;}v[maxn];void init(){    for(int i = 0; i < maxn; ++i)    {        p[i] = i;        r[i] = 0;    }}int f(int x){    return x == p[x] ? x : p[x] = f(p[x]);}void unite(int x, int y){    x = f(x);    y = f(y);    if(x==y) return ;    if(r[x] < r[y]) p[x] = y;    else    {        p[y] = x;        if(r[x] == r[y]) ++r[x];    }    return ;}bool cmp1(node p, node q){    return p.c < q.c;}bool cmp2(node p, node q){    return p.c > q.c;}int main(){    int tmp[maxn];    memset(tmp,0,sizeof(tmp));    memset(F,0,sizeof(F));    tmp[0] = 1; tmp[1] = 2;    F[1] = 1; F[2] = 1;    for(int i = 2; tmp[i-2] + tmp[i-1] < maxn; ++i)    {        tmp[i] = tmp[i-2] + tmp[i-1];        F[tmp[i]] = 1;    }    int T;    cin >> T;    int kase =0;    while(T--)    {        memset(v,0,sizeof(v));        int N, M;        cin >> N >> M;        for(int i  = 0; i < M; ++i)        {            int u, k, c;            scanf("%d%d%d", &u, &k, &c);            v[i].u = u; v[i].v = k; v[i].c = c;        }        node res[maxn];        memset(res,0,sizeof(res));        init();        for(int i =0; i < M; ++i) res[i] = v[i];        for(int i = 0; i < M; ++i)        {            int x = f(res[i].u);            int y = f(res[i].v);            if(x == y) continue;            else unite(res[i].u, res[i].v);        }        int cnt = 0;        for(int i = 1; i <= N; ++i)            if(p[i] == i) ++cnt;        if(cnt != 1)        {            cout << "Case #" << ++kase << ": No" << endl;            continue;        }        //===========================================        init();        memset(res,0,sizeof(res));        for(int i =0; i < M; ++i) res[i] = v[i];        sort(res,res+M, cmp1);        int lower = 0;        int upper = 0;        for(int i = 0; i < M; ++i)        {            int x = f(res[i].u);            int y = f(res[i].v);            if(x == y) continue;            else            {                if(res[i].c == 1) ++lower;                unite(res[i].u, res[i].v);            }        }        //==========================================        init();        memset(res,0,sizeof(res));        for(int i =0; i < M; ++i) res[i] = v[i];        sort(res,res+M, cmp2);        for(int i = 0; i < M; ++i)        {            if(f(res[i].u) == f(res[i].v)) continue;            else            {                if(res[i].c == 1) ++upper;                unite(res[i].u, res[i].v);            }        }        //=========================================        bool flog = false;        for(int i = lower; i <= upper; ++i)        {            if(F[i])            {                flog = true;                break;            }        }        if(flog) cout << "Case #" << ++kase << ": Yes" << endl;        else cout << "Case #" << ++kase << ": No" << endl;    }    return 0;}


0 0
原创粉丝点击