BZOJ 4264 小C找朋友
2015-09-22 17:38
351 查看
题目大意:给定一张无向图,求有多少对点(x,y)(x≠y)(x,y)(x\neq y)满足对于任意一点z(z≠x,z≠y)z(z≠x,z≠y)满足边(x,z)(x,z)和边(y,z)(y,z)要么都存在,要么都不存在
对于一个点xx我们搞出与这个点相邻的点的集合Adj(x)Adj(x)
那么如果(x,y)(x,y)之间没有边那么点对(x,y)(x,y)满足条件等价于Adj(x)=Adj(y)Adj(x)=Adj(y)
如果(x,y)(x,y)之间有边那么点对(x,y)(x,y)满足条件等价于Adj(x)−y=Adj(y)−xAdj(x)-y=Adj(y)-x
怎么表示一个集合呢?我们给一个点赋予一个64位的整数,然后一个集合用集合内所有的点的异或值来代替就行了
然后一个集合就变成了一个数,没有边的排序处理,有边的枚举边就行了
时间复杂度O(nlogn+m)O(nlogn+m)
对于一个点xx我们搞出与这个点相邻的点的集合Adj(x)Adj(x)
那么如果(x,y)(x,y)之间没有边那么点对(x,y)(x,y)满足条件等价于Adj(x)=Adj(y)Adj(x)=Adj(y)
如果(x,y)(x,y)之间有边那么点对(x,y)(x,y)满足条件等价于Adj(x)−y=Adj(y)−xAdj(x)-y=Adj(y)-x
怎么表示一个集合呢?我们给一个点赋予一个64位的整数,然后一个集合用集合内所有的点的异或值来代替就行了
然后一个集合就变成了一个数,没有边的排序处理,有边的枚举边就行了
时间复杂度O(nlogn+m)O(nlogn+m)
[code]#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 1001001 using namespace std; struct edge{ int x,y; }edges[M]; int n,m; long long a[M],b[M],ans; int main() { srand(19980402); int i,x,y; cin>>n>>m; for(i=1;i<=n;i++) a[i]=(long long)rand()*rand()+rand(); for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); edges[i].x=x; edges[i].y=y; b[x]^=a[y]; b[y]^=a[x]; } for(i=1;i<=m;i++) { x=edges[i].x; y=edges[i].y; if( (b[x]^a[y])==(b[y]^a[x]) ) ++ans; } sort(b+1,b+n+1); int cnt=0; for(i=1;i<=n;i++) { ++cnt; if(i==n||b[i]!=b[i+1]) ans+=(long long)cnt*(cnt-1)>>1,cnt=0; } cout<<ans<<endl; return 0; }
相关文章推荐
- UiAutomator实现打电话功能
- [INS-20802] Oracle Database Configuration Assistant 失败
- css中使用rgba和opacity设置透明度的区别
- 定点瞄准算法
- tihs 关键字
- Prolog第三天作业
- c++ 使用throw抛出异常
- Poj.3100 Root of the Problem【水】 2015/09/22
- JAVA 处理Word模板文件,替换其中的占位符
- git push提交代码出现“One or more refs/for/ names blocks change upload”问题的解决办法
- 在html中打开app
- maven构建eclipse工程的编码问题
- Nginx配置
- 通知中心
- Node.js中的DNS模块
- LAMP环境搭建
- 无锁编程(三) - 忙等待
- hdfs 上面block有异常处理流程
- leetcode Binary Tree Zigzag Level Order Traversal
- 无锁编程(三) - 忙等待