首页 > 其他分享 >奇怪的存图方法

奇怪的存图方法

时间:2023-11-13 20:15:56浏览次数:30  
标签:int void 存图 buc ifo 方法 奇怪 reserve

其实这个想法早就有了,奈何应用实在不多.
这个存图方法可以以较小的常数(自以为吧),达到约等于vector存图的访问连续性.
使用了一些计数排序的思想.

namespace graph{
using e_ifo=int;
int _buc[maxn],*buc=_buc+1;//if 0 index
std::vector<std::pair<int,e_ifo> > H;
e_ifo E[maxm];
struct nod{
    int x,y;
    e_ifo*begin(){return E+x;}
    e_ifo*end(){return E+y;}
}G[maxn];
void reserve(int m){
    H.reserve(m);   
}
void adde(int u,auto&&v){
    ++buc[u],H.emplace_back(u,v);
}
void build(){
    for(int i=1;i<maxn;++i){buc[i]+=buc[i-1];}
    for(auto&[u,v]:H){G[u]={buc[u-1],buc[u]};}
    for(auto&[u,v]:H){E[--buc[u]]=std::move(v);}
    H.clear();
}
}
using graph::adde;
using graph::G;

使用的时候先reserve一下要存的边的数量.

然后调用adde.

最后build.

然后类似vector存图那样用就行了.

例:用这个存图方式写三元环计数.

#include<bits/stdc++.h>
using i64=long long;
constexpr int maxn=1e5+5,maxm=2e5+5;
namespace graph{
using e_ifo=int;
int _buc[maxn],*buc=_buc+1;//if 0 index
std::vector<std::pair<int,e_ifo> > H;
e_ifo E[maxm];
struct nod{
    int x,y;
    e_ifo*begin(){return E+x;}
    e_ifo*end(){return E+y;}
}G[maxn];
void reserve(int m){
    H.reserve(m);   
}
void adde(int u,auto&&v){
    ++buc[u],H.emplace_back(u,v);
}
void build(){
    for(int i=1;i<maxn;++i){buc[i]+=buc[i-1];}
    for(auto&[u,v]:H){G[u]={buc[u-1],buc[u]};}
    for(auto&[u,v]:H){E[--buc[u]]=std::move(v);}
    H.clear();
}
}
using graph::adde;
using graph::G;
template<class T>using vec=std::vector<T>;
using std::cin;
using std::cout;
void solve(){
    int n,m;
    cin>>n>>m;
    graph::reserve(m);
    vec<std::pair<int,int> > alle(m);
    vec<int> deg(n+1),tim(n+1);
    for(auto&[u,v]:alle){
        cin>>u>>v,++deg[u],++deg[v];
    }
    for(auto [u,v]:alle){
        if((deg[u]<deg[v])||(deg[u]==deg[v]&&u<v)){std::swap(u,v);}
        adde(v,u);
    }
    graph::build();
    int ans=0;
    for(int u=1;u<=n;++u){
        for(auto to:G[u]){
            tim[to]=u;
        }
        for(auto to:G[u]){
            for(auto tt:G[to]){
                if(tim[tt]==u){
                    ++ans;
                }
            }
        }
    }
    cout<<ans;
}
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    solve();
    return 0;
}
/*
麻术行走的日复一日
忘却了曾仰望的星辰~
*/

 

标签:int,void,存图,buc,ifo,方法,奇怪,reserve
From: https://www.cnblogs.com/QedDust/p/17830029.html

相关文章

  • phpmailer的使用方法
    具体代码如下composer requirephpmailer/phpmailer<?phpheader('content-type:text/html;charset=utf-8;');set_time_limit(3600);require"vendor/autoload.php";$send_res=sendEmail('主题','内容','[email protected]'......
  • rancher2.7.5更新web证书方法
    1.dockerexec-itxxxx/bin/bash2.kubectl--insecure-skip-tls-verify-nkube-systemdeletesecretsk3s-serving kubectl--insecure-skip-tls-verifydeletesecretserving-cert-ncattle-system rm-f/var/lib/rancher/k3s/server/tls/dynamic-cert.json3.......
  • linux进程通信的六种方法
    一、管道​ 一个进程:​ ​ 所谓的管道,就是内核里面的一串缓存。从管道的一段写入的数据,实际上是缓存在内核中的,另一端读取,也就是从内核中读取这段数据。另外,管道传输的数据是无格式的流且大小受限。​ 父子进程:​ ​ 创建的子进程会复制父进程的文件描述符,这样就做到了两个......
  • selenium和playwright的区别和使用方法
    Selenium和Playwright都是自动化测试工具,可以用于模拟用户操作、执行测试脚本、验证网站功能和性能等。它们的主要区别在于实现方式和功能特性。1.实现方法Selenium是基于浏览器驱动的自动化测试工具,支持多种编程语言和多种浏览器。Selenium通过启动浏览器驱动程序(如Chrome......
  • wifi吞吐量测试和分析方法
    https://blog.csdn.net/tankai19880619/article/details/91966964iperf-cipaddress_server-t60-i1-w2Miperf-s  -i1-w2M-wwindow 对于TCP方式,此设置为TCP窗口大小。对于UDP方式,此设置为接受UDP数据包的缓冲区大小,限制可以接受数据包的最大值-u udp -bUDP......
  • AOP以注解为切入点,获取注解参数和切点方法参数名
    AOP以注解为切入点,获取注解参数和切点方法参数名importcn.lettin.base.response.ResponseObjBaseVo;importcn.lettin.base.response.ResponseVo;importcn.lettin.keeper.edge.utils.UserNodeAuthCheckUtils;importorg.aspectj.lang.ProceedingJoinPoint;importorg.asp......
  • 基于问题、观察和组织的SVVR方法在文化课程中提高学生的演讲表现、课堂参与度和技术接
    (Aquestion,observation,andorganisationbasedSVVRapproachto enhancingstudents'presentationperformance,classroomengagement,andtechnologyacceptanceinaculturalcourse)DOI:10.1111/bjet.13159概念:1、VR:用户可以通过计算机或移动设备在三维环境中与......
  • GB28181/GB35114国标平台LiveGBS适配国产信创环境,使用国产数据库达梦数据库、高斯数据
    1、如何配置切换信创达梦数据库?livecms.ini->[db]下面添加配置如:...[db]dialect=dmurl=dm://SYSDBA:Aa12345678@localhost:5236/livegbs2、如何配置切换高斯数据库?livecms.ini->[db]下面添加配置如:...[db]dialect=gaussurl=host=192.168.2.153port=5432user=l......
  • VSCode ESLint规则警告屏蔽方法
    举例:要屏蔽“Missingtrailingcomma”或“comma-dangle”警告,你可以使用ESLint的配置选项来设置规则。下面是一些方法,你可以根据自己的需求选择其中一种(这里只是举例,其他警告处理方法相同)方法1:在代码中添加注释来禁用规则在你希望屏蔽警告的代码行的上方添加如下注释://esli......
  • VSCode ESLint规则警告屏蔽方法
    举例:要屏蔽“Missingtrailingcomma”或“comma-dangle”警告,你可以使用ESLint的配置选项来设置规则。下面是一些方法,你可以根据自己的需求选择其中一种(这里只是举例,其他警告处理方法相同)方法1:在代码中添加注释来禁用规则在你希望屏蔽警告的代码行的上方添加如下注释://eslint-d......