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;//边权
}