P3469

本文深入探讨了割点在图算法中的作用及其对连通图的影响,详细解释了割点删除后访问次数的计算方法,并通过具体示例阐述了如何避免重复计数。同时,提供了一段AC代码,帮助读者理解割点的识别与处理。

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

对于本题。每个点有两种,割点和正常点

由于割点确实没有太认真学过。。感觉自己像发现新大陆一样。。。。

正常的点一旦被去掉了会少2*(n-1)次访问,整个图依旧是一个完整连通图,而割点去掉后,整个图就会被划分成几个小的连通子图

那么对于割点被消掉后,不但少了 2*(n-1)个访问,划分成了多个子图,子图之间的访问次数也会减少,由于关系是相互的,所以对于割点消除后,一共减少 pre * son * 2个点(pre代表 父节点内全部点, son 代表子树内全部点)

当然 假设这个割点一旦存在 2个甚至多个子树,我们还要减去重复计数的部分。

可以想一下。。。举个例子:

1-2 2-3 2-4 这种情况。

减去重复技术,对于割点,我们在进行tarjan的时候,要设置父节点,避免原路返回,之后如果 low[ t ] >= dfn[ x ] 说明 x->t点后,t除了原路返回之外,回不到比 x 这个点更靠前的点了,说明 x 就是一个割点了。

以下是 AC 代码。。

割点模板题 可以参考 P3388

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
#define ll long long int
struct edge
{
    ll nxt,to;
}ed[maxn*30];
ll head[30*maxn],cnt;
ll dfn[maxn],low[maxn],tot,Bcnt;
ll ans[maxn],sz[maxn];
ll n,m;
inline void add(int a,int b)
{
    ed[++cnt].to=b;
    ed[cnt].nxt=head[a];
    head[a]=cnt;
}
inline ll read()
{
    int X=0,w=0; char ch=0;
    while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
    while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
void tarjan(int x, int f)
{
    int size = 1, ua = 0;
    dfn[x] = low[x] = ++tot;
    for(int i = head[x]; i ; i=ed[i].nxt)
    {
        ll t = ed[i].to;
        if(t == f) continue;
        if(!dfn[t])
        {
            tarjan(t, x);
            size += sz[t];
            low[x] = min(low[x], low[t]);
            if(low[t] >= dfn[x])
            {
                ua += sz[t];
                ans[x] += 2 * sz[t] * (n - ua - 1);
            }
        }
        else low[x] = min(low[x], dfn[t]);
    }
    sz[x] = size;
    ans[x] += 2 * (n - 1);
}
int main()
{
    n=read(); m=read();
    int a,b;
    for(int i = 1; i <= m; i++)
    {
      a=read(),b=read();
      add(a, b); add(b, a);
    }
    tarjan(1, 0);
    for(int i = 1; i <= n; i++)
      printf("%lld\n", ans[i]);
    return 0;
}

 

帮我看一下这个报错:06-12 03:36:49.417 5514 5514 E AndroidRuntime: Process: wifip2p.wifi.com.wifip2p, PID: 5514 06-12 03:36:49.417 5514 5514 E AndroidRuntime: java.lang.RuntimeException: Unable to start activity ComponentInfo{wifip2p.wifi.com.wifip2p/wifip2p.wifi.com.wifip2p.activity.SendFileActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.net.wifi.p2p.WifiP2pManager$Channel android.net.wifi.p2p.WifiP2pManager.initialize(android.content.Context, android.os.Looper, android.net.wifi.p2p.WifiP2pManager$ChannelListener)' on a null object reference 06-12 03:36:49.417 5514 5514 E AndroidRuntime: at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3469) 06-12 03:36:49.417 5514 5514 E AndroidRuntime: at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3663) 06-12 03:36:49.417 5514 5514 E AndroidRuntime: at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85) 06-12 03:36:49.417 5514 5514 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 06-12 03:36:49.417 5514 5514 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 06-12 03:36:49.417 5514 5514 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2067) 06-12 03:36:49.417 5514 5514 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106) 06-12 03:36:49.417 5514 5514 E AndroidRuntime: at android.os.Looper.loop(Looper.java:272) 06-12 03:36:49.417 5514 5514 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:7971) 06-12 03:36:49.417 5514 5514 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 06-12 03:36:49.417 5514 5514 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604) 06-12 03:36:49.417 5514 5514 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:986) 06-12 03:36:49.417 5514 5514 E AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.net.wifi.p2p.WifiP2pManager$Channel android.net.wifi.p2p.WifiP2pManager.initialize(android.content.Context, android.os.Looper, android.net.wifi.p2p.WifiP2pManager$ChannelListener)' on a null object reference
最新发布
06-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值