参考链接:https://www.cnblogs.com/Kohinur/p/8947142.html
链式前向星
#include<iostream> #include<string.h> #include<queue> using namespace std; #define MAXN 100501 struct NODE{ int next;//与第i条边同起点的下一条边的位置 int v;//第i条边的终点 int w;//第i条边的边权 }edge[MAXN]; int cnt;//内存计数器 int head[MAXN]; bool visdfs[MAXN]; bool visbfs[MAXN]; void add(int u,int v,int w){ edge[cnt].w=w; edge[cnt].v=v; //edge[i]表示第i条边的终点 edge[cnt].next=head[u]; //head[i]表示以i为起点的最后一条边的储存位置 head[u]=cnt++; } void DFS(int x) { visdfs[x] = true; printf("%d ", x); for(int i = head[x]; i != 0; i = edge[i].next) { if(!visdfs[edge[i].v]) { DFS(edge[i].v); } } } void BFS(int x) { queue<int> q; q.push(x); visbfs[x] = true;//标记 while (!q.empty()) { int i=q.front(); q.pop(); cout<<i<<endl; for(int k = head[i]; k != 0; k = edge[k].next) { if(!visbfs[edge[k].v]) { visbfs[edge[k].v] = true; //标记 q.push(edge[k].v); } } } } void BFS1(int x) { int q[MAXN];//队列 int jin = 0, chu = 0, st; q[jin++] = x; visbfs[x] = true;//标记 while(chu < jin) { st = q[chu++]; printf("%d ", st); for(int k = head[st]; k != 0; k = edge[k].next) { if(!visbfs[edge[k].v]) { visbfs[edge[k].v] = true; //标记 q[jin++] = edge[k].v; } } } } void Print() { int k, i; for(i = 1; i <= 5; i++) { if(head[i])//找边 { for(k = head[i]; k != 0; k = edge[k].next) { printf("%d->%d %d ", i, edge[k].v, edge[k].w); } } } } int main(){ //init cnt=1; memset(head,0,sizeof(head)); memset(visbfs, 0, sizeof(visbfs)); memset(visdfs, 0, sizeof(visdfs)); //一共有多少组数据 int n; cin>>n; int a,b,c; while(n--){ cin>>a>>b>>c; add(a,b,c); } // Print(); // DFS(1); BFS1(1); //访问某个点所有连接的点 // int start; // cin>>start; // for(int i=head[start];i!=0;i=edge[i].next) // cout<<start<<"->"<<edge[i].v<<" "<<edge[i].w<<endl; return 0; } /* 7 1 2 1 2 3 1 3 4 1 1 3 1 4 1 1 1 5 1 4 5 1 */
vector存储
#include<iostream> #include<vector> #include<algorithm> #include<cstring> #include<string> #include<cstdio> #include<queue> #include<cstdlib> #define N 110 #define INF 0x3f3f3f3f using namespace std; int n,m; bool visdfs[N]; bool visbfs[N]; struct node { int d,w; };//定义一个结构体来存储每个入度点以及对应边的权值 //比如边u->d,权值为w,node结构体存储的就是d以及w。 vector<node>v[N]; void DFS(int x) { visdfs[x] = true; printf("%d ", x); vector<node> s=v[x]; for(int i = 0; i <s.size(); i++) { if(!visdfs[s[i].d]) { DFS(s[i].d); } } } void BFS(int x) { queue<int> q; q.push(x); visbfs[x] = true;//标记 while (!q.empty()) { int i=q.front(); q.pop(); cout<<i<<endl; vector<node> s=v[i]; for(int k = 0; k <s.size(); k++) { if(!visbfs[s[k].d]) { visbfs[s[k].d] = true; //标记 q.push(s[k].d); } } } } int main() { //对于N非常大但是M很小的这种稀疏图来说,用邻接矩阵N*N是存不下的。邻接矩阵是将所有的点都存储下来了,然而 //对于稀疏图来说,有很多点是没有用到的,把这些点也存储下来的话就会很浪费空间。可以用邻接表来存储,这里借助vector来实现邻接表的操作。 //用邻接表存储时候,只存储有用的点,对于没有用的点不存储,实现空间的优化。 //n个点m条边 memset(visdfs, 0, sizeof(visdfs)); memset(visbfs,0,sizeof(visbfs)); cin>>n>>m; int a,b,c; for(int i=0; i<=n; i++) v[i].clear();//将vecort数组清空 for(int i=1; i<=m; i++) //用vector存储邻接表 { node nd; scanf("%d%d%d",&a,&b,&c); nd.d=b,nd.w=c;//将入度的点和权值赋值给结构体 v[a].push_back(nd);//将每一个从a出发能直接到达的点都压到下标为a的vector数组中,以后遍历从a能到达的点就可以直接遍历v[a] // nd.d=a,nd.w=c;//无向图的双向存边 // v[b].push_back(nd); } // DFS(2); BFS(1); return 0; }