最大食物链计数 (图上dp)

P4017
本题对于每个生物而言,除了最菜的和最强的之外,都有吃他们的人和被他们吃的人,也就是每个节点的入度和出度,入度为零的点是生产者,出度为零的点是最优消费者。
本题思路大致为,不断的除掉入度为零的点,并且把去掉的点所记录的食物链种数,加到它所能到达的点,有点类似于过河卒,只不过没有马并且地图也由网格变成了图。dp的过程由BFS来实现,随着BFS进行,更新dp结果,最后得到答案。
AC代码:

#include
using namespace std;
const int mod = 80112002;
vectornumbers[5005];
int chu[5005], ru[5005];
int res = 0;
int zhi[5005];
int main()
{
	int n, m; cin >> n >> m;
	while (m--)
	{
		int a, b; cin >> a >> b;
		chu[a]++;
		ru[b]++;
		numbers[a].push_back(b);
	}
	queueans;
	for (int i = 1; i <= n; i++)if (ru[i] == 0)
	{
		zhi[i] = 1;
		ans.push(i);
	}
	while (!ans.empty())
	{
		int t = ans.front();
		ans.pop();
		for (int i = 0; i < numbers[t].size(); i++)
		{
			ru[numbers[t][i]]--;
			zhi[numbers[t][i]] = (zhi[numbers[t][i]] +zhi[t])%mod;
			if (ru[numbers[t][i]] == 0)
			{
				if (chu[numbers[t][i]] == 0)
				{
					res += zhi[numbers[t][i]];
					res %= mod;
				}
				else ans.push(numbers[t][i]);
			}
		}
	}
	cout << res;
}

你可能感兴趣的:(个人题解,bfs,动态规划)