图以及搜索
作者:互联网
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;
}
标签:ru,以及,int,vis,++,edge,搜索,cu 来源: https://www.cnblogs.com/citurs/p/16073896.html