BZOJ 1574:[Usaco2009 Jan]地震损坏Damage

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接到所有短信之后,找出最小的不可能回到农庄的牛棚数目.这个数目包括损坏的牛棚. 注意:前50次提交将提供在一些测试数据上的运行结果.

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里面的牛无法回到农庄.

题解

bfs就好。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#define mod 30000
using namespace std;
int P,m,n,ans;
int zz=0,head[30002];
struct bian {int to,nx;} e[200002];
int q[100002],t,w;
bool del[30002],pd[30002],vis[30002];
void insert(int x,int y)
{
	zz++; e[zz].to=y; e[zz].nx=head[x]; head[x]=zz;
	zz++; e[zz].to=x; e[zz].nx=head[y]; head[y]=zz;
}
void shanc(int x)
{
	int i=head[x];
	while(i)
	   {del[e[i].to]=1; i=e[i].nx;}
}
void bfs()
{
	t=0;w=1; q[t]=1; pd[1]=1;
	while(t<w)
	   {int p=q[t]; t++;
	    for(int i=head[p];i;i=e[i].nx)
	       {if(!del[e[i].to]&&!pd[e[i].to])
		       {pd[e[i].to]=1; q[w++]=e[i].to; ans--;}
		   }
	   }
}
int main()
{
	scanf("%d%d%d",&P,&m,&n);
	for(int i=1;i<=m;i++)
	   {int x,y;
		scanf("%d%d",&x,&y);
	    insert(x,y);
	   }
	for(int i=1;i<=n;i++)
	   {int x;
	    scanf("%d",&x); shanc(x);
	   }
	ans=P-1; bfs();
	printf("%d",ans);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值