洛谷 1道经典图论题目 题解

题目传送门

题目描述

The cows are having a picnic! Each of Farmer John's K (1 ≤ K ≤ 100) cows is grazing in one of N (1 ≤ N ≤ 1,000) pastures, conveniently numbered 1...N. The pastures are connected by M (1 ≤ M ≤ 10,000) one-way paths (no path connects a pasture to itself).

The cows want to gather in the same pasture for their picnic, but (because of the one-way paths) some cows may only be able to get to some pastures. Help the cows out by figuring out how many pastures are reachable by all cows, and hence are possible picnic locations.

K(1≤K≤100) 只奶牛分散在 N(1≤N≤1000)个牧场.现在她们要集中起来进餐。牧场之间有 M(1≤M≤10000) 条有向路连接,而且不存在起点和终点相同的有向路.她们进餐的地点必须是所有奶牛都可到达的地方。那么,有多少这样的牧场可供进食呢?

输入格式

Line 1: Three space-separated integers, respectively: K, N, and M

Lines 2..K+1: Line i+1 contains a single integer (1..N) which is the number of the pasture in which cow i is grazing.

Lines K+2..M+K+1: Each line contains two space-separated integers, respectively A and B (both 1..N and A != B), representing a one-way path from pasture A to pasture B.

输出格式

Line 1: The single integer that is the number of pastures that are reachable by all cows via the one-way paths.

输入输出样例

输入 #1

复制代码
2 4 4
2
3
1 2
1 4
2 3
3 4

输出 #1

复制代码
2

说明/提示

The cows can meet in pastures 3 or 4.

思路:

什么玩意儿啊?翻译都不给全!我作为啥也不懂的小学生,简直崩溃了!幸好我还有另一个刷题点(链接: 首页),里面有这道题的中文版(链接: 题目---母牛野餐)可以去看一下(没登陆的话下面有)以下是中文大意:

k(1≤k≤100)只奶牛分散在n(1≤n≤1000)个牧场。

现在它们要集中起来进餐。

牧场之间有m(1≤m≤10000)条有向路连接,而且不存在起点和终点相同的有向路。

它们进餐的地点(牧场)必须是所有奶牛都可到达的地方.那么,有多少这样的牧场呢?

第一行共三个整数k,n,m

接下来k行,每行一个整数表示一只奶牛所在的牧场编号

接下来m行,每行两个整数,表示一条有向路的起点和终点

所有奶牛都可到达的牧场个数

输入样例:

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

输出样例:

2

样例解释

牧场3,4是这样的牧场.

知道大意,就可以开始做题了!

俗话说的好,"图论背模板,数论背公式,高精背代码,动规背方程",我们首先定义一堆数组和变量(一个vector存储图),然后直接套DFS的模板!然后输入两下,直接DFS!最后统计有几个牧场可以到达的数量=总牧场的数量,然后输出就OK啦!

AC代码:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
int num[1005],vis[1005],cnt[1005];
int k,n,m,ans;
vector<int>v[1005];
void DFS(int x)
{
    cnt[x]++;
    vis[x]=1;
    for(int i=0;i<v[x].size();i++)
    {
        if(!vis[v[x][i]])
        {
            DFS(v[x][i]);
        }
    }
}
int main()
{
    cin >> k >> n >> m;
    for(int i=1;i<=k;i++)
    {
        cin >> num[i];
    }
    for(int i=1;i<=m;i++)
    {
        int x,y;
        cin >> x >> y;
        v[x].push_back(y);
    }
    for(int i=1;i<=k;i++)
    {
        memset(vis,0,sizeof(vis));
        DFS(num[i]);
    }
    for(int i=1;i<=n;i++)
    {
        if(cnt[i]==k)
        {
            ans++;
        }
    }
    cout<<ans;
    return 0;
}

看到DFS函数里的东西,你是不是眼前一亮?对,这就是当年把我虐的****的图的深度优先遍历!

(其实广度优先遍历才是我最痛恨的,因为我做了3天才做出来!)所以,下一篇我们就来扒一扒这俩玩意儿

这篇博客就到这里啦,我们下篇博客再见!

相关推荐
MiyamiKK575 分钟前
leetcode_字符串 409. 最长回文串
数据结构·算法·leetcode
半盏茶香25 分钟前
扬帆数据结构算法之雅舟航程,漫步C++幽谷——LeetCode刷题之移除链表元素、反转链表、找中间节点、合并有序链表、链表的回文结构
数据结构·c++·算法
哎呦,帅小伙哦33 分钟前
Effective C++ 规则41:了解隐式接口和编译期多态
c++·effective c++
CodeJourney.1 小时前
小型分布式发电项目优化设计方案
算法
DARLING Zero two♡1 小时前
【初阶数据结构】逆流的回环链桥:双链表
c语言·数据结构·c++·链表·双链表
9毫米的幻想1 小时前
【Linux系统】—— 编译器 gcc/g++ 的使用
linux·运维·服务器·c语言·c++
带多刺的玫瑰1 小时前
Leecode刷题C语言之从栈中取出K个硬币的最大面积和
数据结构·算法·图论
Cando学算法1 小时前
Codeforces Round 1000 (Div. 2)(前三题)
数据结构·c++·算法
薯条不要番茄酱1 小时前
【动态规划】落花人独立,微雨燕双飞 - 8. 01背包问题
算法·动态规划
小林熬夜学编程1 小时前
【Python】第三弹---编程基础进阶:掌握输入输出与运算符的全面指南
开发语言·python·算法