博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ1315 : Ural1557Network Attack
阅读量:6500 次
发布时间:2019-06-24

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

找到一棵dfs搜索树,给每条非树边一个随机非0权值,每条树边为所有经过它的树边的权值的异或。

那么有2种情况是合法的:

1.一条边权值为0,一条边权值非0。

2.两条边异或和为0。

排序后统计即可,时间复杂度$O(m\log m)$。

 

#include
#include
const int N=2010,M=100010;int n,m,i,j,e[M][2],g[N],v[M<<1],w[M<<1],nxt[M<<1],ed,d[N],dfn,f[N],c0,c1;unsigned long long seed,h[M],tag[N],ans;inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}inline void add(int x,int y,int z){v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;}void dfs(int x){ d[x]=++dfn; for(int i=g[x];i;i=nxt[i])if(w[i]!=f[x]){ int y=v[i]; if(d[y]&&d[y]<=d[x]){ for(seed=seed*233+17;!seed;seed=seed*233+17); h[w[i]]=seed,tag[x]^=seed,tag[y]^=seed; }else if(!d[y])f[y]=w[i],dfs(y); }}void cal(int x){ for(int i=g[x];i;i=nxt[i])if(f[v[i]]==w[i]&&d[v[i]]>d[x])cal(v[i]),tag[x]^=tag[v[i]]; h[f[x]]=tag[x];}int main(){ read(n),read(m); for(i=1;i<=m;i++)read(e[i][0]),read(e[i][1]),add(e[i][0],e[i][1],i),add(e[i][1],e[i][0],i); dfs(1),cal(1); for(i=1;i<=m;i++)if(h[i])c1++;else c0++; ans=1ULL*c0*c1; std::sort(h+1,h+m+1); for(i=1;i<=m;i=j){ for(j=i;j<=m&&h[i]==h[j];j++); ans+=1ULL*(j-i)*(j-i-1)/2; } return printf("%llu",ans),0;}

  

转载地址:http://eevyo.baihongyu.com/

你可能感兴趣的文章
mvc学习地址
查看>>
masonry 基本用法
查看>>
使用openssl创建自签名证书及部署到IIS教程
查看>>
Word产品需求文档,已经过时了【转】
查看>>
dtoj#4299. 图(graph)
查看>>
关于网站的一些js和css常见问题的记录
查看>>
zabbix-3.4 触发器
查看>>
换用代理IP的Webbrowser方法
查看>>
【视频编解码·学习笔记】7. 熵编码算法:基础知识 & 哈夫曼编码
查看>>
spark集群安装部署
查看>>
MySql 查询表字段数
查看>>
mariadb 内存占用优化
查看>>
Centos7安装编译安装zabbix2.219及mariadb-5.5.46
查看>>
Visual Studio Remote Debugger(for 2005/2008) .net远程调试<转>
查看>>
怎么获得combobox的valueField值
查看>>
浅谈C/C++中的static和extern关键字
查看>>
Console-算法[if,while]-一输入两个正整数m和n,求其最大公约数和最小公倍数
查看>>
浅谈网络协议(四) IP的由来--DHCP与PXE
查看>>
jre与jdk的区别
查看>>
全景图的种类
查看>>