图的存储
使用邻接表来存储
| #include <bits/stdc++.h> |
| using namespace std; |
| |
| const int N=1e5; |
| |
| vector<int>edge[N]; |
| |
| |
| int main() |
| { |
| int n,m; |
| cin>>n>>m; |
| for(int i=0;i<m;i++) |
| { |
| int u,v; |
| cin>>u>>v; |
| |
| edge[u].push_back(v); |
| |
| |
| } |
| |
| } |
使用邻接矩阵来存储
配合动态数组
| #include <bits/stdc++.h> |
| using namespace std; |
| |
| int n,m; |
| |
| vector<vector<int> >adj; |
| |
| bool find_edge(int u,int v) |
| { |
| return adj[u][v]; |
| } |
| |
| |
| |
| int main() |
| { |
| cin>>n>>m; |
| adj.resize(n+1); |
| for(int i=1;i<=m;i++) |
| { |
| int u,v; |
| cin>>u>>v; |
| adj[u][v]=1; |
| |
| } |
| } |
链式前向星
1.这个知识点需要学习一下链表的知识,否则不好理解。
2.我们把每条边看成了一个结点,这个结点存v,w,next,然后head数组,每一个head[i]相当于每一条链表的头节点指向的下一个地址,i相当于第i条链表,每一条链表存的对应的边的集合,通过next连接起来。
3.建议画图去实现一下,会发现就是类似于链表的头插法。实在不会b站搜视频看看。
| #include <bits/stdc++.h> |
| using namespace std; |
| const int N=1005; |
| int n,m,idx; |
| |
| struct Edge{ |
| int to; |
| int w; |
| int next; |
| |
| }edge[N]; |
| |
| int head[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++; |
| |
| } |
| |
| int main() |
| { |
| memset(head,-1,sizeof head); |
| cin>>n>>m; |
| for(int i=1;i<=m;i++) |
| { |
| int u,v,w; |
| cin>>u>>v>>w; |
| add(u,v,w); |
| |
| |
| |
| |
| |
| |
| } |
| |
| |
| for(int i=1;i<=n;i++) |
| { |
| for(int j=head[i];j!=-1;j=edge[j].next) |
| { |
| |
| } |
| } |
| |
| |
| |
| |
| } |
拿邻接表为例写出dfs遍历
| #include <bits/stdc++.h> |
| using namespace std; |
| vector<vector<int> >edge; |
| bool vis[10005]; |
| int n,m; |
| |
| void dfs(int x) |
| { |
| stack<int>st; |
| st.push(x); |
| vis[x]=1; |
| while(!st.empty()) |
| { |
| int from=st.top(); |
| st.pop(); |
| for(auto to:edge[from]) |
| { |
| if(!vis[to]){ |
| vis[to]=true; |
| st.push(to); |
| } |
| } |
| } |
| |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| int main() |
| { |
| cin>>n>>m; |
| edge.resize(n+1); |
| for(int i=1;i<=m;i++) |
| { |
| int u,v; |
| edge[u].push_back(v); |
| } |
| } |
| |
拿邻接表为例写出bfs遍历
| #include <bits/stdc++.h> |
| using namespace std; |
| vector<vector<int> >edge; |
| bool vis[10005]; |
| int n,m; |
| void bfs(int x) |
| { |
| queue<int>q; |
| q.push(x); |
| vis[x]=1; |
| while(!q.empty()) |
| { |
| int u=q.front(); |
| q.pop(); |
| for(auto t:edge[u]) |
| { |
| if(!vis[t]){ |
| vis[t]=1; |
| q.push(t); |
| } |
| } |
| } |
| |
| } |
| |
| |
| int main() |
| { |
| cin>>n>>m; |
| edge.resize(n+1); |
| for(int i=1;i<=m;i++) |
| { |
| int u,v; |
| edge[u].push_back(v); |
| } |
| } |
| |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?