学习的秦总的写法写的 dfs 找独立回路和异或消元:秦总博客
独立回路的定义和独立回路个数 =M−N+1 的证明,博客里面都有,但是 dfs 找的过程好像需要 2 倍的空间,不能理解。。。
分析:这题要明白一个东西,
附上代码:
#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;
struct Edge{
int u,v,nt;
LL val;
}edge[maxm<<1];
void add_edge(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++;
}
int n,m,tot;
LL val[maxm<<1];
LL d[maxn];
bool vis[maxn];
void Build_Graph(){
memset(vis,false,sizeof(vis));
edge_cnt = 0;
memset(head,-1,sizeof(head));
int u,v;
LL val;
FOR(i,0,m){
scanf("%d%d%lld",&u,&v,&val);
add_edge(u,v,val);
add_edge(v,u,val);
}
}
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 row = 0;
for(int i = 62;i >= 0;-- i){
int j;
for(j = row;j < tot;++ j) {
if(val[j] & (1LL<<i)) break;
}
if(j != tot){
swap(val[j],val[row]);
for(j = 0;j < tot;++ j){
if(j == row) continue;
if(val[j] & (1LL<<i)){
val[j] ^= val[row];
}
}
++ row;
}
}
return row;
}
void work(){
LL ans = d[n];
n = xorguass();
FOR(i,0,n) ans = max(ans,ans^val[i]);
printf("%lld\n",ans);
}
int main()
{
//freopen("test.in","r",stdin);
while(~scanf("%d%d",&n,&m)){
Build_Graph();
tot = 0;
d[1] = 0;
dfs(1,-1);
work();
}
return 0;
}