リンク:https://ac.nowcoder.com/acm/contest/945/G
出典:牛オフネットワーク
タイトル説明
牛はピクニックを持っています!ファーマージョンのK牛(100≤1≤K)がNのいずれかに放牧された(1≤N≤千)牧草地のそれぞれ、便利な1 ... Nの番号が付け。牧草地は、M(10,000≤1≤M)一方向パス(パスがそれ自体に牧草を接続しない)によって接続されています。
牛は、いくつかの牛は唯一のいくつかの牧草地に得ることができるかもしれません(なぜなら、一方向のパスで)自分のピクニックのために同じ牧草地に集まりたい、けど。すべての牛から到達可能であるので、可能なピクニックの場所ですどのように多くの牧草地を考え出すことにより、牛を助けます。
説明を入力します。
行1:三つのスペースで区切られた整数、それぞれ:K、N、およびM
線2 ... K + 1:回線I + 1はiが放牧された牛に牧草地の数であり、単一の整数(1 ... N)を含有。
行K + 2 ... M + K + 1:各行は、牧草地Bに牧草地Aから一方向経路を表す2つのスペースで区切られた整数、それぞれA及びB(!1 ... NとAの両方= B)を含有します
出力説明:
行1:一方向経路を介してすべての乳牛によって到達可能である牧草地の数である単一の整数。
エントリー
2 4 4
2
3
1 2
1 4
2 3
3 4
輸出
2
説明
4 <-3
^ ^
| |
| |
1-> 2
上記のように牧草地を牧草2および3における牛と、レイアウトされている
牛が牧草地3又は4で満たすことができます。
**効果の対象:図の**異なる位置牛の多くは、姿を求めて、すべての牛は何を指すことができます。
問題解決のアイデア:
ノードが直接牛のDFS、及びノード数に、各牛はこれにノードを追加できるようになり、kの最終的な外観は、の数に等しいです。
ACコード:
/*
* Copyright (c) 2019 Ng Kimbing, HNU, All rights reserved. May not be used, modified, or copied without permission.
* @Author: Ng Kimbing, HNU.
* @LastModified:2019-06-25 T 15:35:29.755 +08:00
*/
package ACMProblems.QianDaoTi;
import java.util.ArrayList;
import static ACMProblems.ACMIO.*;
public class cowDfs {
private static boolean[] visited;
private static ArrayList<Integer>[] lists;
private static void dfs(int i) {
visited[i] = true;
for (int next : lists[i]) {
if (!visited[next])
dfs(next);
}
}
@SuppressWarnings("unchecked")
public static void main(String[] args) throws Exception {
setStream(System.in);
int k = nextInt();
int n = nextInt();
int m = nextInt();
int[] cows = new int[k];
lists = new ArrayList[n];
int[] sum = new int[n];
visited = new boolean[n];
for (int i = 0; i < n; ++i)
lists[i] = new ArrayList<>();
for (int i = 0; i < k; ++i)
cows[i] = nextInt() - 1;
while (m-- != 0) {
int x = nextInt() - 1;
int y = nextInt() - 1;
lists[x].add(y);
}
for (int cow : cows) {
dfs(cow);
for (int j = 0; j < n; j++) {
if (visited[j]) {
++sum[j];
visited[j] = false;
}
}
}
int count = 0;
for (int i = 0; i < n; i++)
if (sum[i] == k)
++count;
System.out.println(count);
}
}