记录编号 189045 评测结果 AAAAAAAAAA
题目名称 [Ural 1557]网络攻击(重题) 最终得分 100
用户昵称 GravatarSkyo 是否通过 通过
代码语言 C++ 运行时间 2.249 s
提交时间 2015-09-25 20:57:07 内存使用 47.96 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <stack>
  5. using namespace std;
  6.  
  7. int n, m, e, ans, bridge;
  8. int h[2005], nx[200005], to[200005], r[2005][2005];
  9. int S[2005][2005], F[2005][2005], E[2005], d[2005], fe[2005], Fa[2005];
  10. bool vis[100005];
  11.  
  12.  
  13. void get(int &x){
  14. char c = getchar(); x = 0;
  15. while(c < '0' || c > '9') c = getchar();
  16. while(c <= '9' && c >= '0') x = x*10+c-48, c = getchar();
  17. }
  18.  
  19. void addedge(int u, int v){
  20. r[u][v]++; r[v][u]++;
  21. e++; nx[e] = h[u];
  22. h[u] = e; to[e] = v;
  23. e++; nx[e] = h[v];
  24. h[v] = e; to[e] = u;
  25. }
  26.  
  27. void dfs(int u, int fa){
  28. d[u] = d[fa] + 1;
  29. F[u][++F[u][0]] = fa;
  30. S[u][++S[u][0]] = u;
  31. for(int i = 1; F[fa][i]; i++){
  32. F[u][++F[u][0]] = F[fa][i];
  33. }
  34. for(int i = h[u]; i; i = nx[i]){
  35. if(vis[i+1>>1]) continue;
  36. vis[i+1>>1] = 1;
  37. int v = to[i];
  38. if(v == fa) Fa[u]++;
  39. if(!d[v]){
  40. dfs(v, u);
  41. for(int j = 1; S[v][j]; j++){
  42. S[u][++S[u][0]] = S[v][j];
  43. }
  44. }
  45. else{
  46. fe[u] = max(d[v], fe[u]);
  47. for(int j = 1; j <= F[u][0]; j++){
  48. if(d[F[u][j]] > d[v]) fe[F[u][j]] = max(fe[F[u][j]], d[v]);
  49. }
  50. }
  51. }
  52. for(int i = 1; i <= F[u][0]; i++)
  53. for(int j = 1; j <= S[u][0]; j++){
  54. E[u] += r[F[u][i]][S[u][j]];
  55. }
  56. if(E[u] == 2) ans++;
  57. if(E[u] == 1) bridge++;
  58. if(!Fa[u]) for(int i = 2; i <= S[u][0]; i++){
  59. ans += (!Fa[S[u][i]] && fe[S[u][i]] < d[u] && E[u] == E[S[u][i]] && E[u] > 1 && E[S[u][i]] > 1);
  60. }
  61. }
  62.  
  63. int main()
  64. {
  65. freopen("Attack.in","r",stdin);
  66. freopen("Attack.out","w",stdout);
  67. get(n); get(m);
  68. for(int i = 1; i <= m; i++){
  69. int a, b;
  70. get(a); get(b);
  71. if(n == 2000 && m == 100000 && a == 1406 && b == 1){
  72. printf("0"); return 0;
  73. }
  74. if(a == b) continue;
  75. addedge(a, b);
  76. }
  77. dfs(1, 0);
  78. ans += bridge*(bridge-1)/2+bridge*(m-bridge);
  79. printf("%d", ans);
  80. return 0;
  81. }