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;
    }
    
  • 相关阅读:
    高中信息技术《算法与程序设计VB(选修)》知识要点
    信息技术选修一总结
    文学给人以相爱的力量
    雾霾
    杯子
    递归
    死锁
    高精度计算练习1
    高精度加法的优化
    字符串函数与过程
  • 原文地址:https://www.cnblogs.com/poorpool/p/8757210.html
Copyright © 2011-2022 走看看