C - Cow Picnic POJ - 3256(vector)

牛野餐   http://poj.org/problem?id=3256

时间限制: 2000MS   内存限制: 65536K
提交总数: 5945   接受: 2452

描述

奶牛正在野餐!每个农民约翰的ķ(1≤ ķ ≤100)奶牛放牧是在一个ñ(1≤ ñ ≤1000)牧场,方便编号为1 ... ñ。草场由连接中号(1≤ 中号 ≤10,000)单向路径(没有路径牧场连接到本身)。

奶牛想要聚集在同一个牧场上野餐,但(由于单向路径),一些奶牛可能只能到达一些牧场。通过确定所有奶牛可以到达多少牧场来帮助奶牛,因此可能是野餐地点。

输入

第1行:三个空格分隔的整数,分别为:KNM 
行2 .. K +1:行i + 1包含一个整数(1 .. N),这是牛的牧场数正在吃草。 
线K +2 .. M + K +1:每条线包含两个以空格分隔的整数,分别为AB(均为1 .. NA!= B),表示从牧场A到牧场B的单向路径。

产量

第1行:单个整数,它是所有奶牛通过单向路径可到达的牧场数量。

样本输入

2 4 4
2
3
1 2
1 4
2 3
3 4

样本输出

2

暗示

奶牛可以在3号或4号牧场见面。

资源

USACO 2006年12月银奖

  思路就是所有牛单向能到达的地点的个数:用深搜可以遍历所有的点。

这里的关键是vector的使用

#include <iostream>
#include <vector>
using namespace std;
int main()
{
	vector<int>a[30];
	for(int j=1;j<=6;j++){
		for(int i=1;i<=6;i++)
		{
			a[j].push_back(i);//注意,第一个数的下标是0 
		}
	}
	for(int j=1;j<=6;j++){
		for(int i=0;i<6;i++)
		{
			cout << a[j][i];//可以化为二维数组,但注意下标。 
			if(i==5) cout <<endl;
		}
	}
	return 0;
}

结果

代码如下:

#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int cow[105]={0},num[1005]={0};//cow,牛的位置,num,所能到达此位置的牛的个数 
int bj[1005]={0};//标记, 
int k,n,m,i;
vector<int>mc[1005];
void dfs(int x)c
{
	bj[x] = 1;//标记目前位置 
	num[x]++;//这个位置这头牛可以到达,能到达此地的牛数量加1 
	for(int i=0;i<mc[x].size();i++)//当前数组不为空时循环; 
		if(bj[mc[x][i]]==0) 
			dfs(mc[x][i]);
}
int main()
{
	scanf("%d%d%d",&k,&n,&m);
	for(i=1;i<=k;i++)
		scanf("%d",&cow[i]);
	for(i=1;i<=m;i++)
	{
		int xx,yy;
		scanf("%d%d",&xx,&yy);
		mc[xx].push_back(yy);
	}
	for(i=1;i<=k;i++)//次数为牛的个数 
	{
		for(int j=1;j<=n;j++) bj[j] = 0;//每次循环都要初始化标记	
		dfs(cow[i]); 
	}
	int ans=0;
	for(i=1;i<=n;i++)
		if(num[i]==k) ans++;//如果这个地方所有的牛都能来,故符合条件,所以ans++; 
	printf("%d\n",ans);
	return 0;
}

感谢sdau20172139提供的思路,思路来源:https://blog.csdn.net/wentong_Xu/article/details/81226465

猜你喜欢

转载自blog.csdn.net/orange1710/article/details/81450145