POJ - 3256 ,DFS,算法

题意是有n个小岛,并且,给你k个牛,m条路,但是这些路是单向的,然后把某个牛放到某个岛上,然后这k头牛想要在岛上聚会,然后你要找到所有牛都能到的岛上去,输出一共有几个这样的岛;

第一点,如果这个岛k头牛都能到,那么这个岛就是我们要找的聚集地,
第二点,路是单向的,我们需要单向存图

分析:把题目简化一下就是看拿到一块地,这M头牛能不能到达这里。就是一个DFS,对于每一头牛找出这头牛所能达到
的地的标号,那么这块地的sum数组++。然后对于每一块地判断一下当前地所能到达的牛的头数,如果数量等于牛的总
数量,那么这块地就可以被选作聚会用地

参见大佬的代码(原出处):https://blog.csdn.net/acm_zl/article/details/10468031


#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int map[1005][1005];
int cow[105];
int vis[1005];
int sum[1005];//sum标记岛,有几个牛能到达
int k,n,m;//n是几个岛//m是几条路
void dfs(int x){
	vis[x]=1;
	sum[x]++;
	for(int i=1;i<=n;i++)
	{
		if(!vis[i]&&map[x][i]){
			dfs(i);
		}
	}
}
int main(){
 
	int a,b;
	scanf("%d%d%d",&k,&n,&m);
	for(int i=1;i<=k;i++)
	{
		scanf("%d",&cow[i]);
	}
	memset(map,0,sizeof(map));
	memset(sum,0,sizeof(sum));
	for (int i=1;i<=m;i++)
	{
		scanf("%d%d",&a,&b);
		map[a][b]=1;
	}
	for(int i=1;i<=k;i++)
	{
		memset(vis,0,sizeof(vis));
		dfs(cow[i]);
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		if(sum[i]==k)
		ans++;
	}
	printf("%d",ans);
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Harington/article/details/81974307