题面
对于图上路径异或问题,先抓一棵生成树,对于每条非树边算出接在树上形成的环异或值,将这些值加入线性基中求解。
这里同样的做法,在选生成树时优先选与111号点相连的边。对于非树边分情况讨论:

  1. 存在点 x,yx,yx,y,x,y,1x,y,1x,y,1 中两两有连边。先将 x,yx,yx,y 子树内的非树边加入线性基,若保留 1,x1,x1,x 之间的边或 1,y1,y1,y 之间的边,则该线性基最终会保留下来。若保留这两条边,则 x,yx,yx,y 之间的边也会保留下来。
  2. 直接将非树边加入线性基即可。

综上,可以明显发现与111号点相连的点被分为了很多块,因此考虑DP。设 fi,Bf_{i,B}fi,B​ 表示讨论到第 iii 块,当前加入后的线性基为 BBB。若第 iii 块的边不能异或得到000,则对应上两种情况的转移即可。
线性基在DP时用Hash的方法来存。预先处理出每种线性基的哈希值,两个线性基并的哈希值。设本质不同的线性基有 SSS 个,则在这道题中有 S<400S<400S<400。
时间复杂度 O(nS+S2(log2S+log2w))O(nS+S^2(log_2S+log_2w))O(nS+S2(log2​S+log2​w)),空间复杂度 O(n+S2)O(n+S^2)O(n+S2)

#include<stdio.h>
#include<vector>
#include<map>
using namespace std;
#define R register int
#define I inline
#define N 100001
#define P 1000000007
I void Add(int&x,const int y){x+=y;if(x>=P){x-=P;}
}
struct Edge{int End,Len;
};
vector<Edge>G[N],H[N];
int f[N],st[N],ed[N],len[N],bel[N],ord[N],dis[N],sec[N],trans[400][400],dp[2][400],tot;
bool tag[N],chose[N];
I int GetF(int x){if(f[x]==x){return x;}f[x]=GetF(f[x]);return f[x];
}
I void PreDFS(int x,const int t){bel[x]=t;for(vector<Edge>::iterator T=G[x].begin();T!=G[x].end();T++){int v=T->End;if(v!=1&&bel[v]==0){PreDFS(v,t);}}
}
I void ReDFS(int x,int F){for(vector<Edge>::iterator T=H[x].begin();T!=H[x].end();T++){int v=T->End;if(v!=F){dis[v]=dis[x]^T->Len;ReDFS(v,x);}}
}
struct Basis{int val[5];I void Init(int x){val[0]=x&1;val[1]=x>>1&3;val[2]=x>>3&7;val[3]=x>>6&15;val[4]=x>>10&31;}I bool Insert(int x){for(R i=4;i!=-1;i--){if ((x&1<<i)!=0){if(val[i]!=0){x^=val[i];}else{val[i]=x;for(R j=0;j!=i;j++){if(val[j]!=0&&(val[i]&1<<j)!=0){val[i]^=val[j];}}for(R j=i+1;j!=5;j++){if((val[j]&1<<i)!=0){val[j]^=val[i];}}return true;}}}return false;}I int Hash(){return val[0]|val[1]<<1|val[2]<<3|val[3]<<6|val[4]<<10;}
}b[N];
map<int,int>Q;
I void DFS(Basis B){int t=B.Hash();if(Q.count(t)==false){tot++;Q[t]=tot;ord[tot]=t;for(R i=1;i!=32;i++){Basis C=B;if(C.Insert(i)==true){DFS(C);}}}
}
I void InitTrans(){Basis A,B;A.Init(0);DFS(A);for(R i=1;i<=tot;i++){A.Init(ord[i]);for(R j=1;j<=tot;j++){B.Init(ord[j]);bool f=true;for(R k=0;k!=5;k++){if(A.val[k]!=0&&B.Insert(A.val[k])==false){f=false;break;}}if(f==true){trans[i][j]=Q[B.Hash()];}}}
}
int main(){int n,m,x,ct=0;scanf("%d%d",&n,&m);for(R i=0;i!=m;i++){scanf("%d%d%d",st+i,ed+i,len+i);Edge Tem;Tem.Len=len[i];Tem.End=ed[i];G[st[i]].push_back(Tem);Tem.End=st[i];G[ed[i]].push_back(Tem);}for(R i=1;i<=n;i++){f[i]=i;}for(vector<Edge>::iterator T=G[1].begin();T!=G[1].end();T++){x=T->End;f[x]=1;H[1].push_back(*T);Edge Tem=*T;Tem.End=1;H[x].push_back(Tem);tag[x]=true;if(bel[x]==0){ct++;PreDFS(x,ct);}}for(R i=0;i!=m;i++){if(GetF(st[i])!=GetF(ed[i])){f[f[st[i]]]=ed[i];Edge Tem;Tem.Len=len[i];Tem.End=ed[i];H[st[i]].push_back(Tem);Tem.End=st[i];H[ed[i]].push_back(Tem);}else if(st[i]!=1&&ed[i]!=1){chose[i]=true;}}ReDFS(1,0);for(R i=1;i<=ct;i++){sec[i]=-1;}InitTrans();for(R i=0;i!=m;i++){if(chose[i]==true){int l=bel[st[i]];if(tag[st[i]]==true&&tag[ed[i]]==true){if(sec[l]==-1){sec[l]=dis[st[i]]^dis[ed[i]]^len[i];}}else if(b[l].Insert(dis[st[i]]^dis[ed[i]]^len[i])==false){sec[l]=-2;}}}Basis A;A.Init(0);dp[0][Q[A.Hash()]]=1;int lt=0;for(R i=1;i<=ct;i++){if(sec[i]!=-2){lt++;for(R j=1;j<=tot;j++){dp[lt&1][j]=dp[1^lt&1][j];}int d=Q[b[i].Hash()];for(R j=1;j<=tot;j++){Add(dp[lt&1][trans[d][j]],dp[1^lt&1][j]);}if(sec[i]!=-1){for(R j=1;j<=tot;j++){Add(dp[lt&1][trans[d][j]],dp[1^lt&1][j]);}if(b[i].Insert(sec[i])==true){int d2=Q[b[i].Hash()];for(R j=1;j<=tot;j++){Add(dp[lt&1][trans[d2][j]],dp[1^lt&1][j]);}}}}}int ans=0;for(R i=1;i<=tot;i++){Add(ans,dp[lt&1][i]);}printf("%d",ans);return 0;
}

Codeforces 1299 D 环游世界相关推荐

  1. BZOJ 2055: 80人环游世界 [上下界费用流]

    2055: 80人环游世界 题意:n个点带权图,选出m条路径,每个点经过val[i]次,求最小花费 建图比较简单 s拆点限制流量m 一个点拆成两个,限制流量val[i],需要用上下界 图中有边的连边, ...

  2. JZOJ 3943. 【GDOI2015模拟11.29】环游世界

    Description ZTY 想要环游世界!他会驾驶一架飞机沿着赤道顺时针飞行一周.现在他手头有 S 架飞 机,每架飞机的油箱都有自己的容量限制di,表示在飞机的油箱装满的情况下,最远可以飞 行多远 ...

  3. 《暖暖环游世界》:突破女性休闲游戏的商业化局限

    <暖暖环游世界>集成KTplay社交引擎给玩家提供游戏内社区,上线短短两天内就产生了26000条话题,截止发稿玩家已经在社区里产生28万的话题,我们十分好奇这是一款怎样的游戏使得社区如此火 ...

  4. 搞事情 | 大数据文摘和ta的朋友们:环游世界的80天

    2017年 大数据文摘收获了 500+位新的志愿者, 7月份,我们在宇宙中心 举办了夏季狂欢Concert 在北京和超过200位真爱 面对面喝了一杯 2018年 文摘菌也想要对那些 分布在全球各地 毫 ...

  5. 环游世界已经高于购置房产成为千禧一代最希望实现的愿望

    Airbnb爱彼迎在上海举行了第三季度媒体沟通会,并携手第一财经商业数据中心共同发布了<2019千禧一代旅行者洞察报告>(下述"报告").在活动上,爱彼迎中国总裁彭韬更 ...

  6. 美通企业日报 | Gap在华门店总数突破200家;千禧一代环游世界的愿望超过买房...

    要闻 职场调查显示,青年人相对中年人缺乏运动的员工比例更大 环游世界已经高于购置房产成为千禧一代最希望实现的愿望 阿迪达斯携手中国运动健儿发布70周年广告片 Gap品牌大中华地区门店总数突破200家 ...

  7. 环游世界,走遍读过的每一个国家和城镇

    昨天一个苏州的好兄弟举行了婚礼.我上午就到了苏州,还有几个小时时间,不想干等,想起苏州还有个地方没去--寒山寺,于是赶将过去. 其实我对寺庙不太感兴趣,尤其是现在的寺庙--烧香拜佛而已.我没有进去,在 ...

  8. 暖暖环游世界显示服务器异常,暖暖环游世界

    <暖暖环游世界>游戏中有不少问题玩家们都会经常问到,诸如衣服不见了.登陆不了游戏.自动签到失效.花园闪退等情况.在遇到这些问题时我们应该怎么办呢?小编今天就为大家带来<暖暖环游世界& ...

  9. 暖暖环游世界显示服务器异常,暖暖环游世界客服常见问题汇总

    暖暖环游世界客服常见问题汇总告诉你<暖暖环游世界>客服常见问题汇总来了!暖暖环游世界客服常见问题一定就是大家平时遇到最最频繁的问题,其中主要是以登陆以及闪退的问题居多,特此小编为大家汇总了 ...

  10. VR环游世界:英国-伦敦

    很多人都有过环游世界的梦想,我也不例外.环游世界的条件是:有钱+有时间+身体健康. 所以大部分人都无法实现这个梦想.现实中不能实现的梦想,只能靠做梦吗?我希望给梦想加上一点现实感.因此,VR环游世界系 ...

最新文章

  1. 整合初步---------SSH(注解版)
  2. 沙利文:奢侈品防伪领域RFID技术作用巨大
  3. python画圆形螺旋线_PS画结构素描与示范-金属管道台灯(电脑绘画)
  4. Arts 第十八周(7/15 ~ 7/21)
  5. Android 系统性能优化(41)---Android代码内存优化建议-OnTrimMemory优化
  6. Codeforces Round #158 (Div. 2) A - Adding Digits
  7. 混沌思维模型实战课课件分享
  8. Oracle字符到数值转换错误
  9. 通过 Azure 媒体管理门户开始使用直播流媒体
  10. SQLServer数据库分页查询
  11. 解决文件名太长或文件夹路径太深无法删除
  12. 大规模额外涨薪后,Intel又准备了24亿美元,明年再涨工资!
  13. iOS 修改app名称
  14. 人体计算机原理,人体静力学
  15. 开关电源环路学习笔记(2)-线性化条件
  16. 【Android初学者】UI组件 介绍
  17. java中not equal_Java ObjectUtils.notEqual方法代码示例
  18. 详解Minimax算法与α-β剪枝
  19. 16 tia 内容说明 安装包_TIA Portal V16 软件安装包 安装教程 授权
  20. Week4 常用类 麻了

热门文章

  1. 领导力教练:世界著名企业教练们的实践心得(原书第3版)
  2. matlab传递函数状态方程转换,利用matlab对状态方程与传递函数转换
  3. java调用高德地图获取经纬度
  4. UVA 11137 Ingenuous Cubrency(dp)
  5. PhotoShop - 建立剪切蒙版
  6. PDF怎么提取图片,这三个方法你肯定不知道
  7. Synonyms,一个开源的中文近义词工具包
  8. 【财经期刊FM-Radio|2021年01月27日】
  9. 如何通过Photoshop制作Gif图片(把几张图片合成一张Gif图片)
  10. tomcat设置一级域名、二级域名访问指定项目