常见算法的实现伪代码及时间复杂度

目录

  • 目录
    • 找欧拉回路
    • 不知道是啥
    • 线段树
    • 堆优化prim
    • 并查集优化kruskal

找欧拉回路

dfs思想

find_circuit(结点i){
    当结点i有邻居时
{  
    选择任意一个邻居j;
    删除边(i,j)或者做访问标记;
    find_circuit(结点j);
}
    输出或存储节点i;
}
`
<时间复杂度> O(m+n)
`
1、奇点:出度为奇数的点
2、定义:欧拉回路:通过图的每条边一次且仅一次回到起点的路径
欧拉通路:通过图的每条边一次且仅一次的路径
3、欧拉定理:1)欧拉通路存在条件:图中奇点数为0或1,图保证联通;若
       奇点数为2,则路径一定从一个奇点开始,到另一个奇点结束
      2)欧拉回路的存在条件:图中无奇点,图保证联通

不知道是啥

<代码>
for(int i=1;i<=n;i++) for(j=i * i; j<=n;j+=i * i)
复杂度:o(n)

线段树

O(nlogn)

堆优化prim

// luogu-judger-enable-o2
#include
#include
#include
#include
int const maxn=5100,maxn2=200100;
int cost[maxn],vis[maxn],cnt,sum,head[maxn],n,m,num;
struct E
{
    int to,next,w;
    E(int to=0,int next=0,int w=0):
        to(to),next(next),w(w){}
}e[maxn2<<1];
struct node
{
    int nd,dis;
    bool operator<(const node &b)const
    {
        return dis>b.dis;
    }
    node(int nd=0,int dis=0):
        nd(nd),dis(dis){}
};
void add(int x,int y,int w)
{
    e[++cnt]=(E){y,head[x],w};
    head[x]=cnt;
}
void readin()
{
    scanf("%d%d",&n,&m);
    for(int u,v,w,i=1;i<=m;i++)
    {
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w);
        add(v,u,w);
    }

}
void prim()
{
    std::priority_queueq;
    q.push(node(1,0));
    cost[1]=0;
    while(!q.empty())
    {
        int u=q.top().nd;
        int val=q.top().dis;
        q.pop();
        if(vis[u])
            continue;
        num++;
        sum+=val;
        vis[u]=true;
        for(int i=head[u];i!=-1;i=e[i].next)
        {
            int v=e[i].to;
            if(e[i].wvoid write()
{
    if(num<0)
    {
        printf("orz");
        return;
    }
    printf("%d",sum);
}
int main()
{
    memset(head,-1,sizeof(head));
    memset(cost,0x7f7f7f7f,sizeof(cost));
    readin();
    prim();
    write();
    return 0;
}

O(nlogn)
(稠密图优)

并查集优化kruskal

O(mlogm)
(稀疏图优)

你可能感兴趣的:(算法)