POJ 3256 Cow Picnic

一道DFS的题目。刚开始纠结了很久怎么判断牧场满不满足条件,试着去枚举所有两头牛的组合。后来发现这样的复杂度太高,反过来思考问题的话顿时简单了很多。如果一个牧场有K头牛能到达的话即满足了题意。这样O(n)时间判断牧场就可以了。

另外因为是稀松图,采用邻接表储存的话会比较简单。DFS里面的下标容易搞混...需要注意

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>

using namespace std;

const int MAXN = 1005;

vector<int> a[MAXN];
int vis[MAXN], ans[MAXN], cow[MAXN];
int k, n, m;

void DFS(int index)
{
	for (int i = 0; i < a[index].size(); i++)
	{
		if (!vis[a[index][i]])
		{
			ans[a[index][i]]++;
			vis[a[index][i]] = 1;
			DFS(a[index][i]);
		}
	}
}

int main()
{
	while (scanf("%d%d%d", &k, &n, &m) != EOF)
	{
		memset(ans, 0, sizeof(ans));

		for (int i = 1; i <= k; i++)
			scanf("%d", &cow[i]);

		for (int i = 0; i < m; i++)
		{
			int u, v;
			scanf("%d%d", &u, &v);
			a[u].push_back(v);
		}

		for (int i = 1; i <= k; i++)
		{
			memset(vis, 0, sizeof(vis));
			vis[cow[i]] = 1;
			ans[cow[i]]++;
			DFS(cow[i]);
		}

		int count = 0;
		for (int i = 1; i <= n; i++)
			if (ans[i] == k)
				count++;

		printf("%d\n", count);
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值