牛野餐 http://poj.org/problem?id=3256
时间限制: 2000MS | 内存限制: 65536K | |
提交总数: 5945 | 接受: 2452 |
描述
奶牛正在野餐!每个农民约翰的ķ(1≤ ķ ≤100)奶牛放牧是在一个ñ(1≤ ñ ≤1000)牧场,方便编号为1 ... ñ。草场由连接中号(1≤ 中号 ≤10,000)单向路径(没有路径牧场连接到本身)。
奶牛想要聚集在同一个牧场上野餐,但(由于单向路径),一些奶牛可能只能到达一些牧场。通过确定所有奶牛可以到达多少牧场来帮助奶牛,因此可能是野餐地点。
输入
第1行:三个空格分隔的整数,分别为:K,N和M
行2 .. K +1:行i + 1包含一个整数(1 .. N),这是牛我的牧场数正在吃草。
线K +2 .. M + K +1:每条线包含两个以空格分隔的整数,分别为A和B(均为1 .. N和A!= B),表示从牧场A到牧场B的单向路径。
产量
第1行:单个整数,它是所有奶牛通过单向路径可到达的牧场数量。
样本输入
2 4 4
2
3
1 2
1 4
2 3
3 4
样本输出
2
暗示
奶牛可以在3号或4号牧场见面。
资源
思路就是所有牛单向能到达的地点的个数:用深搜可以遍历所有的点。
这里的关键是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