记录编号 |
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;
- }