链式前向星的两种写法

1.y氏写法

链式前向星注意事项,如果a->b,b->c在前向星中a的临点只有b,所以在求连通块的数量的时候不能一次dfs,要多次dfs!
const int N=?,M=??;//N是点数,M是边数

int h[N],e[M],ne[M],idx;

void add(int a,int b,int W)
{
    e[idx]=b;
    w[idx]=W;
    ne[idx]=h[a];
    h[a]=idx++;
}

for(int i=h[u];~i;i=ne[i])
{
    i可以理解为点的编号,在无向图建立反向边,tarjan求父节点可以写成 tarjan(j,i)//遍历下一个点,父节点为i
    i从idx=0开始的,和 i^1不谋而合
    int j=e[i];//下一个点是
    int W=w[i];//a->的边权是
}
输入
3 4
1 2
1 3
2 3
3 2
输出
这是第1个点
1 0 
这是第2个点
2 
这是第3个点
3  
可见i可以代表某条边
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N=1e5+10,M=N*2;

int h[N],e[M],ne[M],idx;
void add(int a,int b)
{
    e[idx]=b;
    ne[idx]=h[a];
    h[a]=idx++;
}
int main()
{
    int n,m;
    cin>>n>>m;
    memset(h,-1,sizeof h);
    
    while(m--)
    {
        int a,b;cin>>a>>b;
        add(a,b);
    }
    for(int i=1;i<=n;i++)//起点
    {
        cout<<"这是第"<<i<<"个点"<<endl;
        for(int j=h[i];~j;j=ne[j])
        {
            int k=e[j];
            cout<<j<<" ";
        }
        cout<<endl;
    }
    return 0;
}

2.黑书写法

const int N=?,M=??;//N是点数,M是边数

int idx=0,h[N];
struct edge
{
    int to,next,w;
}edge[N];

void add(int u,int v,int W)
{
    edge[idx].to=v;
    edge[idx].w=W;
    edge[idx].next=head[u]
    head[u]=idx++;
}

for(int i=h[u];~i;i=edge[i].next)
{
    int j=edge[i].to;//下一条边
    int W=edge[i].w;//边权
}

posted @ 2020-09-18 19:06  30天CF上蓝!!!  阅读(170)  评论(0编辑  收藏  举报