3896. 【NOIP2014模拟10.26】战争游戏 (Standard IO)

本文深入解析割点算法在图论中的应用,通过具体实例展示如何使用tarjan算法寻找图中的割点,并计算与割点相关的边数。文章提供了一段完整的C++代码实现,帮助读者理解算法的具体操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits  

Description

Input

Output

Sample Input

7 9
1 2
1 3
1 4
1 5
1 6
1 7
2 3
4 5
6 7

Sample Output

18
6
6
6
6
6
6

Data Constraint

Source / Author: 长乐一中 game

 

题解:

找割点

算答案。

#include<bits/stdc++.h>
#define N 50010
#define inf 2147483647
#define rint register ll
#define ll long long
#define point(a) multiset<a>::iterator 
#define mod (ll)(500000)
#define mem(a,b) memset(a,b,sizeof (a))
#define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;

struct edge
{ll v,fr;}e[N*4];

ll n,m,i,j,k,tot,cnt,chid,root;
ll tail[N],dfn[N],low[N],vis[N],size[N],suf[N],a[N],cut[N],ans[N],f[N];


void add(ll u,ll v)
{
    e[++tot].v=v;
    e[tot].fr=tail[u];
    tail[u]=tot;
}

void tarjan(ll x,ll fr)
{
    dfn[x] = low[x] = ++cnt;
    vis[x]=1;
    size[x]=1;
    int can=0,cannot=0,sum=0;
    for(ll p=tail[x];p;p=e[p].fr)
    {
        ll v=e[p].v;
            if(!vis[v])
            {
                tarjan(v,fr);
                size[x] = size[x] + size[v];
                low[x] = min(low[x] , low[v]);
                if(dfn[x] <= low[v] )
				{
					cut[x]=1;
					sum +=size[v] * (n-1 - size[v]);
					can+=size[v];
				} else cannot+=size[v];
            
            }
            low[x] = min(low[x] , dfn[v]);
            
    }
    if(cut[x])sum+=can*(cannot+n-size[x]);
    ans[x]+=sum/2;
}

// ll l ll ll l l 


int main()
{
	open("war");
    scanf("%lld%lld",&n,&m);
    for(i=1;i<=m;i++)
    {
        ll u,v;
        scanf("%lld%lld",&u,&v);
        add(u,v);add(v,u);
    }
    mem(vis,0); mem(cut,0);
    mem(ans,0); mem(size,0);
   
    for(i=1;i<=n;i++)ans[i]=n-1;
    tarjan(1,1);
    for(i=1;i<=n;i++)printf("%d\n",ans[i]);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值