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
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;
}