HDU 5544 Ba Gua Zhen (dfs&独立回路&异或消元)

来源:互联网 发布:数据库update语法 编辑:程序博客网 时间:2024/05/20 19:30

这道题和BZOJ 2115
基本一样,容易一点,直接存个代码:这个代码要好看一点(好像并没有什么区别。。。)

#include <bits/stdc++.h>#define LL long long#define FOR(i,x,y)  for(int i = x;i < y;++ i)#define IFOR(i,x,y) for(int i = x;i > y;-- i)using namespace std;const int maxn = 50050;const int maxm = 100010;int head[maxn],edge_cnt,n,m,tot;struct Edge{    int u,v;    LL val;    int nt;}edge[maxm<<1];void addedge(int u,int v,LL val){    edge[edge_cnt].u = u;    edge[edge_cnt].v = v;    edge[edge_cnt].val = val;    edge[edge_cnt].nt = head[u];    head[u] = edge_cnt++;}void Build_Graph(){    memset(head,-1,sizeof(head));    edge_cnt = 0;    scanf("%d%d",&n,&m);    FOR(i,0,m){        int u,v;    LL val;        scanf("%d%d%I64d",&u,&v,&val);        addedge(u,v,val);        addedge(v,u,val);    }}LL val[maxm<<1];LL d[maxn];bool vis[maxn];void dfs(int u,int fa){    vis[u] = true;    for(int i = head[u];i != -1;i = edge[i].nt){        int v = edge[i].v;        if(v == fa)  continue;        if(!vis[v]){            d[v] = d[u] ^ edge[i].val;            dfs(v,u);        }        else{            val[tot++] = d[u]^d[v]^edge[i].val;        }    }}int xorguass(int n){    int row = 0;    for(int i = 60;i >= 0;-- i){        int j;        for(j = row;j < n;++ j){            if(val[j] & (1LL<<i))   break;        }        if(j != n){            swap(val[j],val[row]);            for(j = 0;j < n;++ j){                if(j == row)    continue;                if(val[j] & (1LL<<i))   val[j] ^= val[row];            }            ++ row;        }    }    return row;}void work(){    memset(vis,false,sizeof(vis));    tot = 0;    d[1] = 0;    dfs(1,-1);    n = xorguass(tot);    LL ans  = 0;    FOR(i,0,n)  ans ^= val[i];    printf("%I64d\n",ans);}int main(){    //freopen("test.in","r",stdin);    int T,tCase = 0;    scanf("%d",&T);    while(T--){        printf("Case #%d: ",++tCase);        Build_Graph();        work();    }    return 0;}
0 0