版权声明:反正也没有人会转,下一个 https://blog.csdn.net/drtlstf/article/details/81282184
Description
农夫John的农场遭受了一场地震。有一些牛棚遭到了损坏,但幸运地,所有牛棚间的路径都还能使用。 FJ的农场有P(1 <= P <= 30,000)个牛棚,编号1..P,C(1 <= C <= 100,000)条双向路径连接这些牛棚,编号为1..C,路径i连接牛棚a_i和b_i (1 <= a_i<= P;1 <= b_i <= P),路径可能连接a_i到它自己,两个牛棚之间可能有多条路径。农庄在编号为1的牛棚。N (1 <= N <= P)头在不同牛棚的牛通过手机短信report_j(2 <= report_j <= P)告诉FJ它们的牛棚(report_j)没有损坏,但是它们无法通过路径和没有损坏的牛棚回到到农场。当FJ接到所有短信之后,找出最小的不可能回到农庄的牛棚数目。这个数目包括损坏的牛棚。
Input
第1行: 三个空格分开的数: P, C, 和 N
第2..C+1行: 每行两个空格分开的数: a_i 和 b_i * 第C+2..C+N+1行: 每行一个数: report_j
Output
第1行: 一个数,最少不能回到农庄的牛的数目(包括损坏的牛棚).
Sample Input
4 3 1
1 2
2 3
3 4
3
Sample Output
3
HINT
牛棚2遭到损坏,导致牛棚2, 3, 4里面的牛无法回到农庄.
对于每个report,把与它相邻的点全部封掉(visited设为true)就行了,再从1开始DFS,统计出DFS的调用次数cnt,结果就是p - cnt。
考试的时候凭直觉,结果A了。
#include <bits/stdc++.h>
#define SIZE 30001
using namespace std;
bool visited[SIZE];
int cnt;
vector<int> graph[SIZE];
void dfs(int now)
{
int i, temp;
visited[now] = true;
++cnt; // 统计次数
for (i = 0; i < graph[now].size(); ++i)
{
temp = graph[now][i];
if (!visited[temp])
{
dfs(temp);
}
}
return;
}
int main(void)
{
int p, c, n, x, y, i;
scanf("%d%d%d", &p, &c, &n);
while (c--)
{
scanf("%d%d", &x, &y);
graph[x].push_back(y);
graph[y].push_back(x);
}
while (n--)
{
scanf("%d", &x);
for (i = 0; i < graph[x].size(); ++i)
{
visited[graph[x][i]] = true; // 这是个贪心
}
}
dfs(1);
printf("%d", p - cnt);
return 0;
}