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 【三元环 +分治】相关推荐

  1. 基站建设(三元环计数+根号分治 / bitset)

    基站建设 problem solution code problem 给定 nnn 个地点,以及每个地点的可靠度 RiR_iRi​. 有 mmm 条光纤架,每一条连接两个不同的地点,且是双向的. 测试 ...

  2. HDU - 6184 Counting Stars(思维+三元环)

    题目链接:点击查看 题目大意:给出一个 nnn 个点 mmm 条边组成的无向图,问图中有多少个"三元环对","三元环对"指的是两个三元环共用了一条边 题目分析: ...

  3. 【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 ...

  4. HDU 6184 2017广西邀请赛:Counting Stars(三元环)

    题意: n个点m条边的无向图,问有多少个A-structure 其中A-structure满足V=(A,B,C,D) && E=(AB,BC,CD,DA,AC) 可以看出A-struc ...

  5. 【学习笔记】无向图、有向图的三元环、四元环计数问题(根号分支+bitset)

    三元环计数和四元环计数问题 无向图三元环计数问题 根号分治 bitset 无向图四元环计数问题 有向图三四元环计数问题 无向图三元环计数问题 根号分治 记 di:id_i:idi​:i 在原图中的度数 ...

  6. 牛客挑战赛51 E NIT的gcd(欧拉反演,建图优化,三元环计数)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Problem 给你一个正整数 nnn. 请你输出 ∑i=1n∑j=1n∑k=1ngcd⁡(i,j)g ...

  7. P4619 [SDOI2018]旧试题(莫比乌斯反演,建图优化三重枚举,三元环计数,神仙好题,超级清晰易懂)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 P4619 [SDOI2018]旧试题(莫比乌斯反演,三元环计数) Problem 计算: ∑i=1A ...

  8. Codeforces Gym 100342J Problem J. Triatrip 求三元环的数量 bitset

    Problem J. Triatrip Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...

  9. 洛谷 - P1989 无向图三元环计数(思维建图)

    题目链接:点击查看 题目大意:给出一个 nnn 个点 mmm 条边组成的无向图,求三元环的个数 题目分析:对于原图建新图,对于原来的每条边来说 如果度数不同,度数小的点指向度数大的点 如果度数相同,编 ...

  10. HDU6184【Counting Stars】(三元环计数)

    题面 传送门 给出一张无向图,求 \(4\) 个点构成两个有公共边的三元环的方案数. 题解 orz余奶奶,orz zzk 首先,如果我们知道经过每条边的三元环个数\(cnt_i\),那么答案就是\(\ ...

最新文章

  1. 转载自csdn SQL SERVER 与ACCESS、EXCEL的数据转换
  2. 多并发-最后刷新页面
  3. oracle方差和协方差函数,[转载]方差var、协方差cov、协方差矩阵(浅谈)(三)_函数cov...
  4. [转]计算机专业方面的期刊介绍
  5. WPF对决Silverlight:为项目选择最佳技术
  6. 《SpringMVC从入门到放肆》一、概述
  7. (JAVA)Arrays数组工具类
  8. JAVA网络编程——URL
  9. VirtualBox安装VBoxGuestAdditions增强功能
  10. Airsim动态 | ROS教程(AirSim ROS Tutorial)
  11. java咖啡机_JAVA咖啡机2010款
  12. Oracle VM VirtualBox不能正常运行(电脑强行关机后,Linux不能正常运行)
  13. 认知神经科学背景综述
  14. HDU 6148 Valley Numer (数位dp)
  15. 文献翻译平台(自用)
  16. 如何在iphone/ipad/itouch上设置新浪VIP邮箱
  17. matlab用gui 画函数,MATLAB GUI ,2,使用MATLAB的函数来实现MATLAB GUI,part 1,图
  18. dijkstra最短路径算法视频_单源最短路径(1):Dijkstra 算法
  19. 基于马尔科夫链的关于CpG岛的模式识别分类学习器
  20. 计算机程序式版面,版式设计基本程序!与版式基本形式

热门文章

  1. 几何均数怎样用计算机算,算术均数与几何均数的意义及计算方法
  2. 计算机查看正在运行的程序,win7系统查看当前正在运行程序状态的方法
  3. 拆解ONES,从ONES深挖项目研发管理机制
  4. c语言的get函数的用法,get函数的用法
  5. 安装Linux镜像文件,通过iso镜像文件硬盘安装Liunx (转载)
  6. 算法——霍夫曼编码压缩算法
  7. Spark——Spark Project Tungsten深入解析
  8. 微信网页授权 Vue
  9. 局域网设置_如何设置局域网
  10. js渲染引擎 tempo.js