图以及搜索
2022/3/29 23:26:31
本文主要是介绍图以及搜索,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1.图的介绍
图分为有向图和无向图,而无向图可以看成是一种特殊的有向图,存储图可以使用邻接表,以及邻接矩阵。
个人一般使用邻接表来进行,邻接矩阵适合数据量较多的情况来使用,例如稠密图。
const int MAX = 100; vector<int>edge[MAX]; //使用vrctor数组来存储每一条边 int vis[MAX]; //遍历图使用 int ru[MAX], cu[MAX]; //ru数组记录入度点,cu数组记录出度点 int u, v; int n; void dfs(int x) //深度优先搜索 { vis[x] = 1; for(int i = 0 ; i < edge[x].size(); i++) { int t = edge[x][i]; if(!vis[t]) { vis[t] = 1; dfs(t); } } } void bfs(int x) //广度优先搜索 { queue<int> q; q.push(x); vis[x] = 1; while(!q.empty()) { int a = q.front(); for(int i = 0; i < edge[a].size(); i++) { int t = edge[a][i]; if(!vis[t]) { vis[t] = 1; q.push(t); } } q.pop(); } } void pai() //拓扑排序 { queue<int> q; for(int i = 1; i <= n; i++) { if(ru[i] == 0) q.push(ru[i]); } while(!q.empty()) { int a = q.front(); for(int i = 0; i < edge[a].size(); i++) { int t = edge[a][i]; ru[t]--; if(ru[t] == 0) q.push(ru[t]); } q.pop(); } } int main() { cin >> n; for(int i = 0; i < n; i++) { cin >> u >> v; edge[u].push_back(v); ru[v]++; //进行拓扑排序时候用到 cu[u]++; } }
练习
题目链接
1.最大食物链计数
思路:
暴力搜索可以全部遍历出来,但是会超时,20分。
所以使用别的方法,从每一个顶级消费者开始,如果有下一个被捕食的关系,那么就将下一个被捕食的给加上一,将该生物的入度减一,如果该生物的入度为1,我们就将该生物加入队列里,直到遍历到最后一个生产者,结束。
#include <iostream> #include <vector> #include <queue> using namespace std; const int mod = 80112002; vector<int> dian; vector<int> edge[50005]; int num[50005]; queue<int> di; int u, v; int n, m; int ans; /* void dfs(int x, int ru[], int cu[]) //使用dfs遍历出来的。 { if(cu[x] == 0) { ans++; return; } for(int i = 0; i < edge[x].size(); i++) { ru[edge[x][i]]--; dfs(edge[x][i], ru, cu); } } */ int main(int argc, char *argv[]) { int ru[50005] = {0}; int cu[50005]; cin >> n >> m; for(int i = 0;i < m; i++) { cin >> u >> v; edge[v].push_back(u); ru[u]++; cu[v]++; } for(int i = n; i > 0; i--) { if(ru[i] == 0 && cu[i] != 0) { num[i] = 1; di.push(i); } } while(!di.empty()) { int t = di.front(); for(int i = 0; i < edge[t].size(); i++) { ru[edge[t][i]]--; num[edge[t][i]] = (num[edge[t][i]] + num[t]) % mod; if(ru[edge[t][i]] == 0) di.push(edge[t][i]); } di.pop(); } for(int i = 1; i <= n; i++) { if(cu[i] == 0) ans = (ans + num[i]) % mod; } cout << ans; return 0; }
这篇关于图以及搜索的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南