#52-【图论x贪心】A

版权声明:反正也没有人会转,下一个 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;
}

猜你喜欢

转载自blog.csdn.net/drtlstf/article/details/81282184