记录编号 35505 评测结果 AAAAAAAAAA
题目名称 罪犯问题C 最终得分 100
用户昵称 Gravatarkaaala 是否通过 通过
代码语言 C++ 运行时间 0.617 s
提交时间 2012-02-23 09:22:09 内存使用 9.80 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>

using namespace std;

struct edge
{
	int t;
	edge *next,*back;
	edge(int _t,edge *_next):t(_t),next(_next){}
}*Map[1000001];

int N,M,K,ans,pre[1000001];
bool y[1000001],fl,f[1000001];

void addedge(int s,int t)
{
	Map[s]=new edge(t,Map[s]);
	Map[t]=new edge(s,Map[t]);
	Map[s]->back=Map[t];
	Map[t]->back=Map[s];
}

int dfs(int u,edge *pr)
{
	if(f[u])
		return 0;
	f[u]=true;
	int re=0;
	if(y[u])
		re++;
	for(edge *p=Map[u];p;p=p->next)
		if(p!=pr)
		{
			int tt=p->t;
			if(tt==K)
			{
				pre[K]=u;
				fl=true;
			}
			else
			{
				pre[tt]=u;
				re+=dfs(tt,p->back);
			}
		}
	return re;
}

int main()
{
	freopen("criminalc.in","r",stdin);
	freopen("criminalc.out","w",stdout);
	scanf("%d%d%d",&N,&M,&K);
	for(int i=1;i<=M;i++)
	{
		int k;
		scanf("%d",&k);
		y[k]=true;
	}
	for(int i=1;i<=N;i++)
	{
		int k;
		scanf("%d",&k);
		addedge(i,abs(k));
	}
	for(edge *p=Map[K];p;p=p->next)
	{
		int tt=p->t;
		pre[tt]=K;
		int t=dfs(tt,p->back);
		if(fl)
		{
			fl=false;
			int now=K;
			do
			{
				now=pre[now];
				if(y[now])
					break;
			}while(now!=K);
			if(now==K)
				ans+=min(2,t);
			else
				ans+=2;
		}
		else if(t)
			ans+=1;
	}
	printf("%d\n",ans);
	return 0;
}