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

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    using namespace std;
    typedef long long ll;
    int n, m, uu, vv, hea[100005], cnt, siz[100005], dfn[100005], loo[100005], idx;
    ll ans[100005];
    bool ins[100005];
    struct Edge{
    	int too, nxt;
    }edge[1000005];
    void add_edge(int fro, int too){
    	edge[++cnt].nxt = hea[fro];
    	edge[cnt].too = too;
    	hea[fro] = cnt;
    }
    void dfs(int x, int f){
    	dfn[x] = loo[x] = ++idx;
    	siz[x] = 1;
    	ins[x] = true;
    	int fla=0, sum=0;
    	bool isc=false;
    	for(int i=hea[x]; i; i=edge[i].nxt){
    		int t=edge[i].too;
    		if(!dfn[t]){
    			dfs(t, x);
    			siz[x] += siz[t];
    			loo[x] = min(loo[x], loo[t]);
    			if(loo[t]>=dfn[x]){
    				fla++;
    				sum += siz[t];
    				ans[x] += (ll)siz[t] * (n - siz[t]);
    				if(x!=1 || fla>1)	isc = true;
    			}
    		}
    		else if(ins[t])	loo[x] = min(loo[x], dfn[t]);
    	}	
    	// if(x==1)	cout<<"1's isc: "<<isc<<endl;
    	if(isc)	ans[x] += (ll)(n-sum-1)*(sum+1) + (n-1);
    	else	ans[x] = 2 * (n - 1);
    	ins[x] = false;
    }
    int main(){
    	cin>>n>>m;
    	for(int i=1; i<=m; i++){
    		scanf("%d %d", &uu, &vv);
    		add_edge(uu, vv);
    		add_edge(vv, uu);
    	}
    	for(int i=1; i<=n; i++)
    		if(!dfn[i])
    			dfs(i, 0);
    	for(int i=1; i<=n; i++)
    		printf("%lld
    ", ans[i]);
    	return 0;
    }
    
  • 相关阅读:
    Ubuntu18.04+CUDA+CUDNN+Pytorch环境配置
    VIM入门必读(转)
    简述C和C++的学习历程(转)
    队列
    排序实现
    十进制转二进制
    北邮1467二叉树题引起的思考
    计算机是如何启动的?
    c语言字符串操作实现
    北邮机试——huffman权值问题
  • 原文地址:https://www.cnblogs.com/poorpool/p/8757210.html
Copyright © 2011-2022 走看看