基础图论——邻接链表(利用数组建立)
//邻接链表(链表实现)没有指针,只不过这里少开了一个数组,放到了结构体变量中而已,更容易理解
struct nds{
int y;
int nxt; //比起之前的那种邻接链表,少开了一个数组而已(nxt)
};
nds e[2100];
int lk[2100],ltp;
void ist(int x,int y){
e[++ltp]={y,lk[x]};//这里记录终点和lk的上一个位置
lk[x]=ltp;//更新lk记录的位置
e[++ltp]={x,lk[y]};//无向边,所以这里处理两次
lk[y] = ltp; //更新lk记录的位置
}
void fun(int u){ //输出u节点对应的每个终点的位置
for (int i = lk[u]; i!=0; i =e[i].nxt){
cout << u << "->" << e[i].y<<endl;
}
}
//请一定学会自己寻找乐趣!
// dfs遍历邻接矩阵:
bool f[2100];
void dfs(int x) //x在这里表示图上的节点
{
if (f[x])
return;
f[x] = true; //记忆化
for (int i = 1; i <= n; ++i)
if (e[x][i])
//注意这里是对一行扫描
dfs(i); //接着由i走
}
// bfs遍历邻接链表:
int q[2100],hd=0; hd是队尾,q是队列
bool f[2100];//记忆化
void bfs(){
q[hd=1]=1;//队列中第一个为1号节点
for(int k=1;k<=hd;++k){
for(int i=lk[q[k]];i!=0;i=e[i].nex)
if(!f[e[i].y]){
q[++hd]=e[i].y;//继续入队
f[e[i].y]=true;
}
}
}
// dfs遍历邻接链表:
void dfs(int x){
if(f[x]) return ;
f[x]=true;
cout<<x<<" ";
for(int i=lk[x];i!=0;i=e[i].nxt){
dfs(e[i].y);
}
//这里函数执行完,也会自动结束
}