记录编号 |
35505 |
评测结果 |
AAAAAAAAAA |
题目名称 |
罪犯问题C |
最终得分 |
100 |
用户昵称 |
kaaala |
是否通过 |
通过 |
代码语言 |
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;
}