POJ 6184 【三元环 +分治】
POJ6184入口
题意: 给一张图,n(n<1e5),个点,m(m<2e5)条边,问能组成多少个,以同一条边构成的两个三元环。
思路:暴力枚举每一条边(两端点设为x,y)
然后枚举第三个点z。
1.当du[y]<=sqrt(m),用lik记录所有与x相连的边。然后枚举与y相连的点z,判断z是否与x相连。算法时间m*(sqrt(m))。
2当du[y]>sqrt(m) ,枚举与x相连的点z,用二分在y中查找z(可以用set,耗时比二分多),每次查找时间log(g[y].size()).,由于这种点很少。每次时间与x相连的点数*log(与y相连的点数)
对于每条边枚举的三元环k,答案加上每个c(2,k)。
最终时间大概和m*log(m)。
分治。
(在POJ上提交 最优577ms,平均700ms,最差少于900ms)
ACcode
#include<cstring>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<cmath>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
const int N=100005;
vector<int> g[N];
int n,m,du[N],lik[N];
bool vis[N];
LL ans,kk;
int main()
{int x,y,z,B;while(scanf("%d%d",&n,&m)!=EOF){B=sqrt(m);ans=0;for(int i=1;i<=n;i++){g[i].clear();vis[i]=false;lik[i]=-1;du[i]=0;}for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);du[x]++;du[y]++;g[x].push_back(y);g[y].push_back(x);}for(int i=1;i<=n;i++)sort(g[i].begin(),g[i].end());for(int i=1;i<=n;i++){x=i;vis[x]=true;for(int j=0;j<g[x].size();j++)lik[g[x][j]]=x;for(int j=0;j<g[x].size();j++){kk=0;y=g[x][j];if(vis[y])continue;if(du[y]<=B){for(int k=0;k<g[y].size();k++){z=g[y][k];if(lik[z]==x)kk++;}}else{for(int k=0;k<g[x].size();k++){z=g[x][k];if(z!=x&&binary_search(g[y].begin(),g[y].end(),z))kk++;}}ans=ans+(kk-1)*kk/2;}}printf("%lld\n",ans);}return 0;
}
赛时代码改(800ms)
#include<cstring>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
const int N=100010;
vector<int> g[N];
int a[N*2],b[N*2],n,m,du[N],B;
LL ans,k;
int main()
{while(scanf("%d%d",&n,&m)!=EOF){ans=0;B=sqrt(m);for(int i=1;i<=n;i++){g[i].clear();du[i]=0;}for(int i=1;i<=m;i++){scanf("%d%d",&a[i],&b[i]);g[a[i]].push_back(b[i]);g[b[i]].push_back(a[i]);du[a[i]]++;du[b[i]]++;}for(int i=1;i<=n;i++)sort(g[i].begin(),g[i].end());int x,y,xi,yi,z;for(int i=1;i<=m;i++){x=a[i];y=b[i];xi=0;yi=0;k=0;if(du[y]<=B&&du[x]<=B)while(xi<g[x].size()&&yi<g[y].size()){if(g[x][xi]>g[y][yi])yi++;else if(g[x][xi]<g[y][yi])xi++;else{//cout<<x<<" "<<y<<" "<<g[x][xi]<<endl;xi++;yi++;k++;}}else if(du[x]<=B)for(int j=0;j<g[x].size();j++){z=g[x][j];if(binary_search(g[y].begin(),g[y].end(),z))k++;}elsefor(int j=0;j<g[y].size();j++){z=g[y][j];if(binary_search(g[x].begin(),g[x].end(),z))k++;}ans=ans+k*(k-1)/2;}printf("%lld\n",ans);}return 0;
}
POJ 6184 【三元环 +分治】相关推荐
- 基站建设(三元环计数+根号分治 / bitset)
基站建设 problem solution code problem 给定 nnn 个地点,以及每个地点的可靠度 RiR_iRi. 有 mmm 条光纤架,每一条连接两个不同的地点,且是双向的. 测试 ...
- HDU - 6184 Counting Stars(思维+三元环)
题目链接:点击查看 题目大意:给出一个 nnn 个点 mmm 条边组成的无向图,问图中有多少个"三元环对","三元环对"指的是两个三元环共用了一条边 题目分析: ...
- 【HDU - 6184】Counting Stars(三元环计数,二分,优化暴力,O(m*sqrt(m)),图论)
题干: Little A is an astronomy lover, and he has found that the sky was so beautiful! So he is countin ...
- HDU 6184 2017广西邀请赛:Counting Stars(三元环)
题意: n个点m条边的无向图,问有多少个A-structure 其中A-structure满足V=(A,B,C,D) && E=(AB,BC,CD,DA,AC) 可以看出A-struc ...
- 【学习笔记】无向图、有向图的三元环、四元环计数问题(根号分支+bitset)
三元环计数和四元环计数问题 无向图三元环计数问题 根号分治 bitset 无向图四元环计数问题 有向图三四元环计数问题 无向图三元环计数问题 根号分治 记 di:id_i:idi:i 在原图中的度数 ...
- 牛客挑战赛51 E NIT的gcd(欧拉反演,建图优化,三元环计数)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Problem 给你一个正整数 nnn. 请你输出 ∑i=1n∑j=1n∑k=1ngcd(i,j)g ...
- P4619 [SDOI2018]旧试题(莫比乌斯反演,建图优化三重枚举,三元环计数,神仙好题,超级清晰易懂)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4619 [SDOI2018]旧试题(莫比乌斯反演,三元环计数) Problem 计算: ∑i=1A ...
- Codeforces Gym 100342J Problem J. Triatrip 求三元环的数量 bitset
Problem J. Triatrip Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...
- 洛谷 - P1989 无向图三元环计数(思维建图)
题目链接:点击查看 题目大意:给出一个 nnn 个点 mmm 条边组成的无向图,求三元环的个数 题目分析:对于原图建新图,对于原来的每条边来说 如果度数不同,度数小的点指向度数大的点 如果度数相同,编 ...
- HDU6184【Counting Stars】(三元环计数)
题面 传送门 给出一张无向图,求 \(4\) 个点构成两个有公共边的三元环的方案数. 题解 orz余奶奶,orz zzk 首先,如果我们知道经过每条边的三元环个数\(cnt_i\),那么答案就是\(\ ...
最新文章
- 转载自csdn SQL SERVER 与ACCESS、EXCEL的数据转换
- 多并发-最后刷新页面
- oracle方差和协方差函数,[转载]方差var、协方差cov、协方差矩阵(浅谈)(三)_函数cov...
- [转]计算机专业方面的期刊介绍
- WPF对决Silverlight:为项目选择最佳技术
- 《SpringMVC从入门到放肆》一、概述
- (JAVA)Arrays数组工具类
- JAVA网络编程——URL
- VirtualBox安装VBoxGuestAdditions增强功能
- Airsim动态 | ROS教程(AirSim ROS Tutorial)
- java咖啡机_JAVA咖啡机2010款
- Oracle VM VirtualBox不能正常运行(电脑强行关机后,Linux不能正常运行)
- 认知神经科学背景综述
- HDU 6148 Valley Numer (数位dp)
- 文献翻译平台(自用)
- 如何在iphone/ipad/itouch上设置新浪VIP邮箱
- matlab用gui 画函数,MATLAB GUI ,2,使用MATLAB的函数来实现MATLAB GUI,part 1,图
- dijkstra最短路径算法视频_单源最短路径(1):Dijkstra 算法
- 基于马尔科夫链的关于CpG岛的模式识别分类学习器
- 计算机程序式版面,版式设计基本程序!与版式基本形式