zoukankan      html  css  js  c++  java
  • P3469-[POI2008]BLO-Blockade

     1 #include <bits/stdc++.h>
     2 #define _for(i,a,b) for(int i = (a);i < b;i ++)
     3 #define _rep(i,a,b) for(int i = (a);i > b;i --)
     4 #define INF 0x3f3f3f3f
     5 #define pb push_back
     6 #define maxn (500000+39)
     7 
     8 typedef long long ll;
     9 using namespace std;
    10 inline ll read()
    11 {
    12     ll ans = 0;
    13     char ch = getchar(), last = ' ';
    14     while(!isdigit(ch)) last = ch, ch = getchar();
    15     while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
    16     if(last == '-') ans = -ans;
    17     return ans;
    18 }
    19 inline void write(ll x)
    20 {
    21     if(x < 0) x = -x, putchar('-');
    22     if(x >= 10) write(x / 10);
    23     putchar(x % 10 + '0');
    24 }
    25 int N,M;
    26 int tot = 1;
    27 int num = 0;
    28 int head[maxn],ver[maxn*2],Next[maxn*2];
    29 int dfn[maxn],low[maxn],Size[maxn];
    30 ll ans[maxn];
    31 bool cut[maxn];
    32 void add(int x,int y)
    33 {
    34     ver[++tot] = y;
    35     Next[tot] = head[x];
    36     head[x] = tot;
    37 }
    38 void tarjan(int x)
    39 {
    40     dfn[x] = low[x] = ++num;
    41     Size[x] = 1;
    42     int flag = 0,sum = 0;
    43     for(int i = head[x]; i; i = Next[i])
    44     {
    45         int y = ver[i];
    46         if(!dfn[y])
    47         {
    48             tarjan(y);
    49             Size[x] += Size[y];
    50             low[x] = min(low[x],low[y]);
    51             if(low[y] >= dfn[x])
    52             {
    53                 flag ++;
    54                 ans[x] += (ll)Size[y]*(N-Size[y]);
    55                 sum += Size[y];
    56                 if(x != 1 || flag > 1)
    57                     cut[x] = true;
    58             }
    59         }
    60         else
    61             low[x] = min(low[x],dfn[y]);
    62     }
    63     if(cut[x])
    64         ans[x] += (ll)(N-sum-1)*(sum+1)+(N-1);
    65     else
    66         ans[x] = 2*(N-1);
    67 }
    68 int main()
    69 {
    70     N = read(),M = read();
    71     _for(i,1,M+1)
    72     {
    73         int x = read();
    74         int y = read();
    75         if(x==y)
    76             continue;
    77         add(x,y);
    78         add(y,x);
    79     }
    80     tarjan(1);
    81     _for(i,1,N+1)
    82     write(ans[i]),putchar('
    ');
    83     return 0;
    84 }
  • 相关阅读:
    ubuntu 搜索文件方法(find命令)
    tomcat ip访问
    Linux下tomcat 的启动 关闭 kill
    Hibernate 之 使用
    tar 用法
    ubuntu下配置django+apache+mysql+mod_python+Python
    Windows Mobile Ping 命令实现(转)
    C#异步方法调用(四大方法详解)
    HTML基础(一):HTML简介
    windows2003系统的iis不能下载exe文件
  • 原文地址:https://www.cnblogs.com/Asurudo/p/11605969.html
Copyright © 2011-2022 走看看