上一篇用的是邻接矩阵建图:点击打开链接
所以dfs(&G,0)结果为0 2 3 4 1
dfs(&G,1)结果为1 2 3 4
dfs(&G,2)结果为2 3 4
dfs(&G,3)结果为 3 4
dfs(&G,4)结果为4
#include<stdio.h> #include<string.h> #include<string> #include<iostream> using namespace std; int vis[100]; typedef struct Enode//邻接表边集 { int v; int weight; struct Enode *next; } edgenode; typedef struct Vertexnode//邻接表首结点 { int v; edgenode *first; } vertexnode; typedef struct Graph//图 { vertexnode Vnode[100]; int num_v,num_e; } mygraph; void create(mygraph *G)//建图 { int i,j,k,x,y,z; edgenode *E; cin>>G->num_v>>G->num_e; for(i=0; i<G->num_v; i++) { cin>>G->Vnode[i].v; G->Vnode[i].first=NULL; } for(i=0; i<G->num_e; i++) { scanf("%d%d%d",&x,&y,&z); E=new Enode; E->v=y; E->weight=z; E->next=G->Vnode[x].first; G->Vnode[x].first=E; //如果是无向图就把下面这段代码加上 // E=new Enode; // // E->v=x; // E->weight=z; // E->next=G->Vnode[y].first; // G->Vnode[y].first=E; } } void dfs(mygraph *g,int x)dfs { vis[x]=1; Enode *p; int i,j; printf("%d ",g->Vnode[x]); p=g->Vnode[x].first; while(p) { if(!vis[p->v]) { dfs(g,p->v); } p=p->next; } } int main() { int i,j,k; int tmp,tmp1,tmp2; mygraph G; create(&G); // for(i=0;i<G.num_v;i++) // if(!vis[i])dfs(&G,i); memset(vis,0,sizeof(vis)); dfs(&G,0); printf(" "); memset(vis,0,sizeof(vis)); dfs(&G,1); printf(" "); memset(vis,0,sizeof(vis)); dfs(&G,2); printf(" "); memset(vis,0,sizeof(vis)); dfs(&G,3); printf(" "); memset(vis,0,sizeof(vis)); dfs(&G,4); printf(" "); return 0; } /* 5 5 0 1 2 3 4 0 1 9 0 2 2 1 2 3 2 3 5 3 4 1 */
测试数据中5 5代表节点数和边数为5,下面是结点名0 1 2 3 4 下面几行中分别为为 弧尾(边的起点),弧首(边的终点),和边的权值