zoukankan      html  css  js  c++  java
  • BZOJ 1123:城市道路

    Sol

    就是求割点,把贡献算一下就好。。。直接tarjan

    # include <bits/stdc++.h>
    # define RG register
    # define IL inline
    # define Fill(a, b) memset(a, b, sizeof(a))
    using namespace std;
    typedef long long ll;
    const int _(1e5 + 10);
    
    IL ll Read(){
    	RG ll x = 0, z = 1; RG char c = getchar();
    	for(; c < '0' || c > '9'; c = getchar()) z = c == '-' ? -1 : 1;
    	for(; c >= '0' && c <= '9'; c = getchar()) x = (x << 1) + (x << 3) + (c ^ 48);
    	return x * z;
    }
    
    int n, fst[_], nxt[_ << 2], to[_ << 2], cnt, m, dfn[_], size[_], Index, low[_];
    ll ans[_];
    
    IL void Add(RG int u, RG int v){  to[cnt] = v; nxt[cnt] = fst[u]; fst[u] = cnt++;  }
    
    IL void Dfs(RG int u, RG int ff){
    	dfn[u] = low[u] = ++Index; size[u] = 1; RG int sum = 0;
    	for(RG int e = fst[u]; e != -1; e = nxt[e]){
    		if(to[e] == ff) continue;
    		if(!dfn[to[e]]){
    			Dfs(to[e], u);
    			size[u] += size[to[e]];
    			low[u] = min(low[u], low[to[e]]);
    			if(low[to[e]] >= dfn[u]) ans[u] += 1LL * sum * size[to[e]] * 2, sum += size[to[e]];
    		}
    		else low[u] = min(low[u], dfn[to[e]]);
    	}
    	ans[u] += 1LL * sum * (n - sum - 1) * 2;
    }
    
    int main(RG int argc, RG char* argv[]){
        n = Read(); m = Read();
    	for(RG int i = 1; i <= n; ++i) ans[i] = n + n - 2, fst[i] = -1;
        for(RG int i = 1, u, v; i <= m; ++i) u = Read(), v = Read(), Add(u, v), Add(v, u);
    	Dfs(1, 0);
    	for(RG int i = 1; i <= n; ++i) printf("%lld
    ", ans[i]);
        return 0;
    }
    
    
  • 相关阅读:
    对象的创建
    Java运行时数据区域
    Java内存模型
    LinkedList小练习及相关算法
    面试题之矩阵与转置矩阵相乘
    快速排序
    垃圾收集器
    java垃圾收集相关问题
    Win7下安装Centos7双系统出错:No valid bootloader target device found.
    Scanner类的方法
  • 原文地址:https://www.cnblogs.com/cjoieryl/p/8284193.html
Copyright © 2011-2022 走看看