Ba Gua Zhen HDU

来源:互联网 发布:数据库系统基础 pdf 编辑:程序博客网 时间:2024/05/09 23:44

题目链接点这里

大意:n个点,m条边的无向图,求一个回路的最大异或

,,一个回路可以分解为多个回路,总异或就是各个小回路异或和,因此我们可以先求出所有回路的异或值,然后求线性基,贪心取最大,即可


#include<cstdio>#include<cstring>#include<iostream>#include<math.h>#include<algorithm>#include<queue>using namespace std;#define MX 111111#define INF 0x3f3f3f3f#define mem(x,y) memset(x,y,sizeof(x))typedef  unsigned long long ULL;int head[MX],cnt;int n,m;struct Edge {    int to,nxt;    ULL val;} E[2*MX];void edge_init() {    mem(head,-1);    cnt=0;}void edge_add(int a,int b,ULL  c) {    E[cnt].nxt=head[a];    E[cnt].to=b;    E[cnt].val=c;    head[a]=cnt++;}bool vis[MX];vector<ULL> arr;ULL p[64];ULL value[MX];void DFS(int u,int fa,ULL w) {    for(int i=head[u]; ~i; i=E[i].nxt) {        int v=E[i].to;        if(v==fa)continue;        if(vis[v]) arr.push_back(value[v]^w^E[i].val);        else {            vis[v]=1;            DFS(v,u,value[v]=(w^E[i].val));        }    }}int main() {    freopen("input.txt","r",stdin);    int cas;    cin>>cas;    int _=0;    while(cas--) {        cin>>n>>m;        edge_init();        for(int i=1; i<=m; i++) {            int u,v;            ULL c;            scanf("%d%d%I64u",&u,&v,&c);            edge_add(u,v,c);            edge_add(v,u,c);        }        arr.clear();        mem(vis,0);        vis[1]=1;        DFS(1,0,0);        mem(p,0);        for(int i=0; i<arr.size(); i++) {            for(int j=63; j>=0; j--)if(arr[i]>>j) if(!p[j]) {                        p[j]=arr[i];                        break;                    } else arr[i]^=p[j];        }        ULL ans=0;        for(int i=63; i>=0; i--) if((ans^p[i])>ans) ans^=p[i];        printf("Case #%d: %I64u\n",++_,ans);    }    return 0;}


0 0
原创粉丝点击