当前位置: 首页 > wzjs >正文

建设电动车官网大连seo顾问

建设电动车官网,大连seo顾问,秦州区建设局网站,网站建设零基础好学吗我对这两个其实都不是那么熟悉。 我们略微用一用。 1. 邻接表基本概念 邻接表(Adjacency List)是一种图的存储结构,它通过为每个顶点维护一个链表来存储该顶点的所有邻接顶点。 ​优点​: 节省空间(特别是稀疏图)容易找到某个…

我对这两个其实都不是那么熟悉。

我们略微用一用。

1. 邻接表基本概念

邻接表(Adjacency List)是一种图的存储结构,它通过为每个顶点维护一个链表来存储该顶点的所有邻接顶点。

优点​:

  • 节省空间(特别是稀疏图)
  • 容易找到某个顶点的所有邻接顶点
  • 添加/删除边操作高效

缺点​:

  • 判断两个顶点是否相邻需要遍历链表
  • 相比邻接矩阵,某些操作效率较低

C++中邻接表的实现方式

2.1 使用vector<vector<int>>

这是最常用的实现方式,简洁高效:

vector<vector<int>> adj(n);  // n为顶点数// 添加边(无向图)
adj[u].push_back(v);
adj[v].push_back(u);// 添加边(有向图)
adj[u].push_back(v);

2.2 使用list<int>数组

list<int> *adj = new list<int>[n];// 添加边
adj[u].push_back(v);

2.3 使用结构体/类(带权图)

struct Edge {int to;int weight;
};vector<vector<Edge>> adj(n);// 添加带权边
adj[u].push_back({v, w});

3. 邻接表的基本操作

3.1 初始化

int n = 5; // 顶点数
vector<vector<int>> adj(n);

3.2 添加边

// 无向图
void addEdge(int u, int v) {adj[u].push_back(v);adj[v].push_back(u);
}// 有向图
void addDirectedEdge(int u, int v) {adj[u].push_back(v);
}

3.3 删除边

// 无向图删除边
void removeEdge(int u, int v) {// 删除u->vadj[u].erase(remove(adj[u].begin(), adj[u].end(), v), adj[u].end());// 删除v->uadj[v].erase(remove(adj[v].begin(), adj[v].end(), u), adj[v].end());
}

3.4 遍历邻接顶点

// 遍历顶点u的所有邻接顶点
for(int v : adj[u]) {cout << v << " ";
}

4. 邻接表的常见应用

4.1 图的遍历

DFS实现​:

vector<bool> visited(n, false);void dfs(int u) {visited[u] = true;for(int v : adj[u]) {if(!visited[v]) {dfs(v);}}
}

BFS实现​:

void bfs(int start) {vector<bool> visited(n, false);queue<int> q;q.push(start);visited[start] = true;while(!q.empty()) {int u = q.front();q.pop();for(int v : adj[u]) {if(!visited[v]) {visited[v] = true;q.push(v);}}}
}

4.2 拓扑排序

vector<int> topologicalSort() {vector<int> inDegree(n, 0);vector<int> result;queue<int> q;// 计算入度for(int u = 0; u < n; u++) {for(int v : adj[u]) {inDegree[v]++;}}// 入度为0的节点入队for(int u = 0; u < n; u++) {if(inDegree[u] == 0) {q.push(u);}}// 拓扑排序while(!q.empty()) {int u = q.front();q.pop();result.push_back(u);for(int v : adj[u]) {if(--inDegree[v] == 0) {q.push(v);}}}return result;
}

5. 性能优化技巧

  1. 预分配空间​:如果知道大概的边数,可以预先reserve空间

    for(auto& list : adj) {list.reserve(expected_edges_per_vertex);
    }
  2. 使用emplace_back​:避免临时对象构造

    adj[u].emplace_back(v);
  3. 使用数组代替vector​:对于固定大小的图,性能更好

    vector<int> adj[MAX_NODES];
  4. 使用前向星​:对于极大图,可以节省空间

    struct Edge {int to, next;
    } edges[MAX_EDGES];
    int head[MAX_NODES], edge_count;

6. 邻接表的变体

6.1 带权图的邻接表

struct Edge {int to;int weight;
};vector<vector<Edge>> adj(n);// 添加带权边
adj[u].push_back({v, w});

6.2 使用pair的邻接表

vector<vector<pair<int, int>>> adj(n); // pair<to, weight>// 添加带权边
adj[u].emplace_back(v, w);

6.3 链式前向星

const int MAXN = 100010;
const int MAXM = 200010;struct Edge {int to, next, w;
} edge[MAXM];int head[MAXN], cnt;void init() {memset(head, -1, sizeof(head));cnt = 0;
}void addEdge(int u, int v, int w) {edge[cnt].to = v;edge[cnt].w = w;edge[cnt].next = head[u];head[u] = cnt++;
}

7. 常见问题与解决方案

7.1 处理重复边

// 使用set代替vector
vector<set<int>> adj(n);// 添加边(自动去重)
adj[u].insert(v);
adj[v].insert(u);

7.2 处理重边(允许重复边)

// 直接使用vector即可
vector<vector<int>> adj(n);
adj[u].push_back(v); // 允许重复添加

7.3 快速查询边是否存在

// 使用unordered_set
vector<unordered_set<int>> adj(n);// 查询边u->v是否存在
if(adj[u].count(v)) {// 边存在
}

 

上面其实已经总结邻接表与DFS和BFS结合使用的实例了

那我们直接看题:

代码:
 

# include<iostream>
# include<vector>
# include<queue>using namespace std;int main()
{int n,m;cin>>n>>m;vector<vector<int>> arr(n+1);vector<int> visited(n+1,false);queue<int> q;int u,v;for(int i=0;i<m;i++){cin>>u>>v;arr[u].push_back(v);arr[v].push_back(u);}q.push(1);visited[1] = true;while(!q.empty()){int current = q.front();for(int i:arr[current]){if(!visited[i]){q.push(i);visited[i] = true;}}q.pop();}int unvisited = 0;for(int i=2;i<=n;i++){if(!visited[i]){unvisited++;}}cout<<unvisited<<endl;return 0;
}

ok,其实没有太大必要去详细讲解,你从头仔细看肯定可以看懂的,心静如水,相信自己!

http://www.dtcms.com/wzjs/419692.html

相关文章:

  • 高端的网站名称在线crm系统
  • 河北互联网公司商丘seo推广
  • 东莞搜索优化十年乐云seoseo排名平台
  • 网站域名费seo内部优化方式包括
  • 为什么企业需要建设网站免费广告推广平台
  • 美国网站做调查赚钱可信吗进入百度首页
  • 企业网站备案需要多久珠海百度关键字优化
  • 五金设备网站建设谷歌浏览器下载安装2022最新版
  • 北京南站核酸检测地点网络竞价
  • 石家庄网站建设案例合肥网站推广优化公司
  • 聊城做网站多少钱沈阳seo推广
  • 微信怎么做自己的网站seo优化网站
  • 企业网站建设知名百度竞价点击神器下载安装
  • 成都可以做网站的公司抖音竞价推广怎么做
  • 苏州大型网站建设搜索引擎营销方法
  • 平面设计范文seo技术培训学校
  • 重庆主页网站建设网站优化教程
  • 给一个网站网络优化器下载
  • 手机app界面设计网站注册网站需要多少钱
  • 九江便宜做网站百度关键词优化快速排名软件
  • 关于网站设计的论文今日头条新闻
  • 免费制作网站服务器今日热点新闻大事件
  • asp.netweb网站开发练如何推广网站运营
  • 室内设计公司排名前十强及作品北京网站seo费用
  • 网站建建设心的网站seo优化效果
  • 3有免费建网站东莞网站制作公司
  • 不用下载就能看的网站的浏览器seo技术蜘蛛屯
  • 营销型电子商务网站市场营销专业
  • 网站设计的趋势百度推广怎么做最好
  • 中国建设银行泗水支行的网站今日足球赛事推荐