记录编号 35505 评测结果 AAAAAAAAAA
题目名称 罪犯问题C 最终得分 100
用户昵称 Gravatarkaaala 是否通过 通过
代码语言 C++ 运行时间 0.617 s
提交时间 2012-02-23 09:22:09 内存使用 9.80 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<algorithm>
  7.  
  8. using namespace std;
  9.  
  10. struct edge
  11. {
  12. int t;
  13. edge *next,*back;
  14. edge(int _t,edge *_next):t(_t),next(_next){}
  15. }*Map[1000001];
  16.  
  17. int N,M,K,ans,pre[1000001];
  18. bool y[1000001],fl,f[1000001];
  19.  
  20. void addedge(int s,int t)
  21. {
  22. Map[s]=new edge(t,Map[s]);
  23. Map[t]=new edge(s,Map[t]);
  24. Map[s]->back=Map[t];
  25. Map[t]->back=Map[s];
  26. }
  27.  
  28. int dfs(int u,edge *pr)
  29. {
  30. if(f[u])
  31. return 0;
  32. f[u]=true;
  33. int re=0;
  34. if(y[u])
  35. re++;
  36. for(edge *p=Map[u];p;p=p->next)
  37. if(p!=pr)
  38. {
  39. int tt=p->t;
  40. if(tt==K)
  41. {
  42. pre[K]=u;
  43. fl=true;
  44. }
  45. else
  46. {
  47. pre[tt]=u;
  48. re+=dfs(tt,p->back);
  49. }
  50. }
  51. return re;
  52. }
  53.  
  54. int main()
  55. {
  56. freopen("criminalc.in","r",stdin);
  57. freopen("criminalc.out","w",stdout);
  58. scanf("%d%d%d",&N,&M,&K);
  59. for(int i=1;i<=M;i++)
  60. {
  61. int k;
  62. scanf("%d",&k);
  63. y[k]=true;
  64. }
  65. for(int i=1;i<=N;i++)
  66. {
  67. int k;
  68. scanf("%d",&k);
  69. addedge(i,abs(k));
  70. }
  71. for(edge *p=Map[K];p;p=p->next)
  72. {
  73. int tt=p->t;
  74. pre[tt]=K;
  75. int t=dfs(tt,p->back);
  76. if(fl)
  77. {
  78. fl=false;
  79. int now=K;
  80. do
  81. {
  82. now=pre[now];
  83. if(y[now])
  84. break;
  85. }while(now!=K);
  86. if(now==K)
  87. ans+=min(2,t);
  88. else
  89. ans+=2;
  90. }
  91. else if(t)
  92. ans+=1;
  93. }
  94. printf("%d\n",ans);
  95. return 0;
  96. }