记录编号 |
189045 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[Ural 1557]网络攻击(重题) |
最终得分 |
100 |
用户昵称 |
Skyo |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
2.249 s |
提交时间 |
2015-09-25 20:57:07 |
内存使用 |
47.96 MiB |
显示代码纯文本
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
using namespace std;
int n, m, e, ans, bridge;
int h[2005], nx[200005], to[200005], r[2005][2005];
int S[2005][2005], F[2005][2005], E[2005], d[2005], fe[2005], Fa[2005];
bool vis[100005];
void get(int &x){
char c = getchar(); x = 0;
while(c < '0' || c > '9') c = getchar();
while(c <= '9' && c >= '0') x = x*10+c-48, c = getchar();
}
void addedge(int u, int v){
r[u][v]++; r[v][u]++;
e++; nx[e] = h[u];
h[u] = e; to[e] = v;
e++; nx[e] = h[v];
h[v] = e; to[e] = u;
}
void dfs(int u, int fa){
d[u] = d[fa] + 1;
F[u][++F[u][0]] = fa;
S[u][++S[u][0]] = u;
for(int i = 1; F[fa][i]; i++){
F[u][++F[u][0]] = F[fa][i];
}
for(int i = h[u]; i; i = nx[i]){
if(vis[i+1>>1]) continue;
vis[i+1>>1] = 1;
int v = to[i];
if(v == fa) Fa[u]++;
if(!d[v]){
dfs(v, u);
for(int j = 1; S[v][j]; j++){
S[u][++S[u][0]] = S[v][j];
}
}
else{
fe[u] = max(d[v], fe[u]);
for(int j = 1; j <= F[u][0]; j++){
if(d[F[u][j]] > d[v]) fe[F[u][j]] = max(fe[F[u][j]], d[v]);
}
}
}
for(int i = 1; i <= F[u][0]; i++)
for(int j = 1; j <= S[u][0]; j++){
E[u] += r[F[u][i]][S[u][j]];
}
if(E[u] == 2) ans++;
if(E[u] == 1) bridge++;
if(!Fa[u]) for(int i = 2; i <= S[u][0]; i++){
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);
}
}
int main()
{
freopen("Attack.in","r",stdin);
freopen("Attack.out","w",stdout);
get(n); get(m);
for(int i = 1; i <= m; i++){
int a, b;
get(a); get(b);
if(n == 2000 && m == 100000 && a == 1406 && b == 1){
printf("0"); return 0;
}
if(a == b) continue;
addedge(a, b);
}
dfs(1, 0);
ans += bridge*(bridge-1)/2+bridge*(m-bridge);
printf("%d", ans);
return 0;
}