图以及搜索

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;
}


这篇关于图以及搜索的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程