Ural 1320. Graph Decomposition(并查集,连通分支边数)

来源:互联网 发布:卡拉瓦乔 知乎 编辑:程序博客网 时间:2024/05/18 18:55

题意:一个图,每次删掉相邻的两条边,问能否把全部的边删完。

解法:若图的每个连通分量都有偶数个边就输出1,否则输出0;

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int parent[10000],depth[10000];void Make_Set(int x){    parent[x] = x;    depth[x] = 0;}int Find(int x){    if(parent[x] != x) parent[x] = Find(parent[x]);    return parent[x];}void Union(int u, int v){    u = Find(u); v = Find(v);    if(u == v) return;        if(depth[u] < depth[v]){        parent[u] = v;    }else{        parent[v] = u;        if(depth[u] == depth[v]) ++depth[u];    }}int main(){    int u,v,N = 0,deg[10000];    memset(deg,0,sizeof(deg));        for(int i = 0;i < 10000;++i) Make_Set(i);        while(scanf("%d %d",&u,&v) == 2){        N = max(N,max(u,v));        --u; --v;        Union(u,v);        ++deg[u]; ++deg[v];    }        int cont[10000];    memset(cont,0,sizeof(cont));        for(int i = 0;i < N;++i) cont[Find(i)] += deg[i];        bool odds = false;    for(int i = 0;i < N;++i) if(cont[i] & 2) odds = true;        if(odds) puts("0");    else puts("1");        return 0;}


原创粉丝点击