我在写题目的时候基本上都是用邻接矩阵存图,因为方便,但有时候会发现邻接表过于浪费空间(关键是有时候直接开不了那么大的数组啊,欲哭无泪),所以我尝试了一下用邻接表,应该可以解决空间的问题。
对应的题目:https://pta.patest.cn/pta/test/1011/exam/4/question/12911
#include <iostream>
#include <string.h>
#include <malloc.h>
using namespace std;
int b[1001];///标记数组
struct node{///
int vertex;
struct node *next;
}grap[1001];
typedef struct node *ss;
int n,m,s;
int serch(int x,int y){///判断x,y是否直接相连通
ss point=&grap[x];
point=point->next;///注意
while(point!=NULL){
if(point->vertex==y)return 1;
point=point->next;
}
return 0;
}
void dfs(int w){
b[w]=1;
cout<<w<<” “;
int i;
for(i=1;i<=n;i++){
if(b[i]==0&&serch(w,i)){///判断条件
dfs(i);
if(w==s)cout<<w;
else
cout<<w<<” “;
}
}
}
void creat(int x,int y){
ss point,pp;
pp=(ss)malloc(sizeof(struct node));
pp->vertex=y;
pp->next=NULL;
point=&grap[x];
while(point->next!=NULL)point=point->next;
point->next=pp;
pp=(ss)malloc(sizeof(struct node));///无向图
pp->vertex=x;
pp->next=NULL;
point=&grap[y];
while(point->next!=NULL)point=point->next;
point->next=pp;
}
int main()
{
memset(b,0,sizeof(b));
cin>>n>>m>>s;
int p,q,i;
for(i=1;i<=n;i++){
grap[i].vertex=i;
grap[i].next=NULL;
}
for(i=0;i<m;i++){
cin>>p>>q;
creat(p,q);///创表
}
dfs(s);
for(i=1;i<=n;i++){
if(b[i]==0){
cout<<” 0″<<endl;
break;
}
}
return 0;
}