博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Educational Codeforces Round 27 G. Shortest Path Problem?(Guass异或线性基)
阅读量:4541 次
发布时间:2019-06-08

本文共 1293 字,大约阅读时间需要 4 分钟。

题目链接:

题意:

有n个点,m条边,可能有自环,每条边有一个值,现在定义两点之间的距离为经过的边的异或值。

问从1到n的最短路是多少。

题解:

首先我们用一个dfs将每个环的异或值处理出来。

怎么处理呢,对于当前搜索到的点,如果之前已经访问过了,说明这里存在有环,然后将这个环的异或值存下来。

最后就会有tot个环的异或值,此时也会有一条到n的路径的值x。

现在问题就转换为在这tot个值中选择一个子集,使得x与选出来的子集进行异或,使得价值最小。

然后就可以用高斯来搞一下异或线性基,然后贪心一下就行了。

1 #include
2 #define F(i,a,b) for(int i=(a);i<=(b);++i) 3 using namespace std; 4 typedef pair
P; 5 6 const int N=1e5+7; 7 int a[N*2],tot,n,m,x,y,c,vis[N],to[N]; 8 vector

e[N]; 9 10 void Gauss_xor(int *a,int n){11 for(int u=1<<30,p=0,x;u;u>>=1){12 for(x=++p;x<=n;++x)if(a[x]&u)break;13 if(x>n){p--;continue;}swap(a[p],a[x]);14 F(i,1,n)if(i!=p&&(a[i]&u))a[i]^=a[p];15 }16 }17 18 void dfs(int x,int val)19 {20 vis[x]=1,to[x]=val;21 for(auto it:e[x])if(vis[it.first])22 a[++tot]=to[x]^it.second^to[it.first];23 else dfs(it.first,val^it.second);24 }25 26 int main(){27 scanf("%d%d",&n,&m);28 F(i,1,m)29 {30 scanf("%d%d%d",&x,&y,&c);31 e[x].push_back(P(y,c));32 e[y].push_back(P(x,c));33 }34 dfs(1,0),Gauss_xor(a,tot);35 int ans=to[n];36 for(int i=1;a[i];i++)ans=min(ans,ans^a[i]);37 printf("%d\n",ans);38 return 0;39 }

View Code

 

转载于:https://www.cnblogs.com/bin-gege/p/7522079.html

你可能感兴趣的文章
Codeforces 138D World of Darkraft
查看>>
CentOS 6.4 64位 搭建MySQL-Cluster 7.3.8 集群
查看>>
操作headers
查看>>
[zz] linux kill 进程
查看>>
普林斯顿大学算法课 Algorithm Part I Week 3 比较器 Comparators
查看>>
MySQL之增删改查
查看>>
zeromq示例代码
查看>>
数据库知识点积累
查看>>
好看的背景
查看>>
类名&函数名 是什么意思
查看>>
Silverlight 4 的 WCF NET.TCP 协议
查看>>
关于换位思考
查看>>
设置VSS2005使支持通过Internet访问
查看>>
word2010更改样式
查看>>
百家姓
查看>>
Xcode代码提示里的字母含义
查看>>
[CQOI2017]小Q的表格(数论+分块)
查看>>
leetcode59
查看>>
tcp eaddrnotavail
查看>>
同步带传动张紧轮位置估算
查看>>