首页 > 其他分享 >Living-Dream 系列笔记 第84期

Living-Dream 系列笔记 第84期

时间:2024-11-09 17:58:18浏览次数:1  
标签:Living 连通 cur int 割点 dfn low Dream 84

连通性问题

  • 点双连通:在无向图中,删除一个点(不是 \(x\) 或者 \(y\))后,点 \(x\) 和点 \(y\) 仍然能够彼此到达,那么称 \(x\) 和 \(y\) 是点双连通的。

  • 边双连通:在无向图中,删除一条边后,点 \(x\) 和点 \(y\) 仍然能够彼此到达,那么称 \(x\) 和 \(y\) 是边双连通的。

性质

  • 点双连通不具有传递性,但边双连通具有。

    image

    如图,但 \(y\) 被删去之后,虽然 \(x,y\) 以及 \(y,z\) 都是点双连通的,但是 \(x,z\) 却不是点双连通的了。

    边双连通具有传递性是因为无论删哪条边 \(x,y\) 和 \(y,z\) 都是边双连通的(由定义易知),这也就是说 \(x,z\) 是边双连通的。

割点

性质:

  • 至少三个点的图中才有割点。(易证)

    image

    如图,\(x\) 即为该图的割点。

判定:

若搜索树中,有从 \(x\) 到 \(y\) 的连边,当 \(low_y \ge dfn_x\) 时(定义同 tarjan 算法),说明 \(y\) 能到达的最小时间戳是 \(x\) 的时间戳,即 \(y\) 被 \(x\) 与 \(x\) 之前的结点「隔开」, 因此 \(x\) 可能是割点。

只要 \(x\) 不是搜索树的根结点,或者 \(x\) 是根结点 且 \(x\) 的子结点大于 \(1\) 个,那么 \(x\) 就是割点。

P3388 & UVA10199

板子。

code
#include<bits/stdc++.h>
using namespace std;

const int N=1e5+5;
int n,m,cnt,rt;
vector<int> G[N],ans;
int dfn[N],low[N];
bool cut[N];

void tarjan(int cur){
	dfn[cur]=low[cur]=++cnt;
	int num=0;
	for(int i:G[cur]){
		if(!dfn[i]){
			tarjan(i);
			low[cur]=min(low[cur],low[i]);
			++num;
			if(low[i]>=dfn[cur]&&(cur!=rt||num>1)){
				cut[cur]=1;
			}
		}
		else{
			low[cur]=min(low[cur],dfn[i]);
		}
	}
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>n>>m;
	for(int i=1,u,v;i<=m;i++){
		cin>>u>>v;
		G[u].push_back(v);
		G[v].push_back(u);
	} 
	for(int i=1;i<=n;i++)
		if(!dfn[i])
			rt=i,tarjan(i);
	for(int i=1;i<=n;i++)
		if(cut[i])
			ans.push_back(i);
	cout<<ans.size()<<'\n';
	for(int i:ans)
		cout<<i<<' ';
	return 0;
} 

CF22C

构造题,从简单情况开始考虑

首先 \(m\) 必须 \(\ge n-1\),否则图不可能联通。

当 \(m=n-1\) 时,显然让 \(v\) 作为根,其他点直接向 \(v\) 连边是最简单的方案,其他方案都可以通过改变树的形态的方式使得其与此方案等价。

接着,当 \(m>n-1\) 时,为了使添加的边尽可能多,我们只能孤立出一个子节点,其他的 \(n-2\) 个子节点连出完全图即可。

于是 \(m\) 的上界即为 \(n-1+\frac{(n-2) \times (n-3)}{2}\),做完了。

code
//
//  CF22C.cpp
//
//
//  Created by _XOFqwq on 2024/11/7.
//

#include <bits/stdc++.h>
using namespace std;

int n,m,v;

void print(int x){
    for (int i=1; i<=n; i++) {
        if (!m) {
            return;
        }
        if (i!=v&&i!=x) {
            for (int j=i+1; j<=n; j++) {
                if (!m) {
                    return;
                }
                if (j!=v&&j!=x) {
                    cout<<i<<' '<<j<<'\n',m--;
                }
            }
        }
    }
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n>>m>>v;
    if (m<n-1||m>n-1+(n-2)*(n-3)/2) {
        cout<<-1;
    } else {
        for (int i=1; i<=n; i++) {
            if (i!=v) {
                cout<<v<<' '<<i<<'\n';
            }
        }
        m-=n-1;
        if (v==n) {
            print(n-1);
        } else {
            print(n);
        }
    }
    return 0;
}

P3469

容易发现每个点都有一个基础贡献 \(2 \times (n-1)\),只有割点才会产生额外贡献。

对于割点,将它提起来作为根,于是有子树内的联通块和子树外的联通块。子树内的贡献算两次,单点算两次,然后子树外的再算两次即可。具体见代码实现。

code
//
//  P3469.cpp
//
//
//  Created by _XOFqwq on 2024/11/7.
//

#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N=5e5+5;
int n,m,cnt,rt;
int siz[N],ans[N];
bool cut[N];
int dfn[N],low[N];
vector<int> G[N];

void tarjan(int cur){
    dfn[cur]=low[cur]=++cnt;
    siz[cur]=1;
    int num=0,sum=0;
    for (int i : G[cur]) {
        if (!dfn[i]) {
            tarjan(i);
            siz[cur]+=siz[i];
            low[cur]=min(low[cur],low[i]);
            num++;
            if (low[i]>=dfn[cur]&&(cur!=rt||num>1)) {
                sum+=siz[i];
                ans[cur]+=siz[i]*(n-siz[i]); //子树内两次 + 子树外一次 + 子树内与单点
                cut[cur]=1;
            }
        } else {
            low[cur]=min(low[cur],dfn[i]);
        }
    }
    if (cut[cur]) {
        ans[cur]+=(n-sum-1)*(sum+1)+n-1; //子树外一次 + 子树外与单点 + 一次单点
    } else {
        ans[cur]=2ll*(n-1);
    }
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>n>>m;
    for (int i=1,u,v; i<=m; i++) {
        cin>>u>>v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
    rt=1,tarjan(1);
    for (int i=1; i<=n; i++) {
        cout<<ans[i]<<'\n';
    }
    return 0;
}

标签:Living,连通,cur,int,割点,dfn,low,Dream,84
From: https://www.cnblogs.com/XOF-0-0/p/18525025

相关文章

  • Living-Dream 系列笔记 第85期
    割边在无向图中删了一条边后,图中联通块个数增加,则称该边为割边。判定对于一条\(cur\toi\)的边,若\(low_i>dfn_{cur}\)(不能取等,画图便知理由),则该边为割边。T103481&P1656板子。P1656code#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+5;intn,......
  • 【黑马python:函数进阶】81-84
    目录一、函数的多个返回值二、函数的多种传参方式1.函数参数种类1.1位置参数与关键字参数1.2缺省参数1.3不定长参数三、函数作为参数传递四、匿名函数一、函数的多个返回值如果一个函数要有多个返回值,该如何书写代码?按照返回值的顺序,写对应顺序的多个变量接......
  • P7984 [USACO21DEC] Tickets P 题解
    题目传送门前置知识线段树优化建图|最短路解法考虑对票建虚点,从\(c_{i}\)向\(i+n\)连一条权值为\(p_{i}\)的边,然后从\(i+n\)向\([a_{i},b_{i}]\)连一条权值为\(0\)的边。建出反图后\(1\toi\)和\(n\toi\)的路径集合会有重复统计的部分,不妨以\(dis_{1,i......
  • CF Round 984 C. Anya and 1100(模拟)
    传送门https://codeforces.com/contest/2036/problem/C解题思路先扫一遍字符串,判断有几个1100子串。然后,对于每一次操作,可以算出对答案的影响,减去更改会减少的子串,再加上更改后会增加的子串。代码#include<bits/stdc++.h>usingnamespacestd;chars[200001];intq......
  • 84_api_intro_stock_hk_stockhkindexhistory
    港股指数历史行情数据API接口所有港股指数历史交易行情数据,港指历史数据,支持日期范围筛选。1.产品功能支持根据指数代码和日期范围查询港股指数历史交易数据返回历史交易数据的日期、港股指数代码、开盘价、最高价、最低价和收盘价毫秒级查询性能;支持传递港股指数代码,......
  • 解决安装Dreamweaver时出现vic32.dll错误的方法(提示vic32.dll错误怎么办)
    在安装AdobeDreamweaver时,有时会遇到“vic32.dll”文件缺失或加载失败的错误提示。这不仅会影响安装过程,还会导致软件无法正常运行。本文将详细介绍如何解决这一问题,确保Dreamweaver能够顺利安装和使用。错误原因1.文件缺失:vic32.dll文件可能由于各种原因(如病毒攻击、系统......
  • AtCoder Beginner Contest 284题解
    AtCoderBeginnerContest284A没有什么难点,反着输出一遍就可以了。#include<bits/stdc++.h>usingnamespacestd;stringa[2000];intmain(){ intn; cin>>n; for(inti=1;i<=n;i++)cin>>a[i]; for(inti=n;i;i--)cout<<a[i]<<'\n';......
  • E. Reverse the Rivers(二分)CF984
    题意:给定n个国家,k个地区,aij为第i个国家第j个地区,bij=a1j|a2j|---aij为第i个国家第j个地区的更新值,给出q个问题,每个问题包含m项要求,国家i必须满足m项要求:如果o=='<'必须满足bir<c否则bir>c,输出满足所有条件的最小序号的国家分析:如果o是小于号,用二分找到右区间,如果o是大于号,用二......
  • [ARC084F] XorShift
    模拟赛题。考虑操作的构成,先忽略\(1\)操作,只考虑任意两个数的异或,不难发现所有能构成的数即为线性基。再考虑\(1\)操作,显然可以对开始的每个数率先进行\(1\)操作再构建线性基。记\(lim=\max(\log_2a,\log_2m)\),发现所有可能有效的数都不超过\(2^{2lim}\)。再考......
  • springboot高校医务室管理系统-计算机设计毕业源码58407
    目 录摘 要1绪论1.1研究背景与意义1.2国内外研究现状1.3论文结构与章节安排1.4相关技术、工具简介2 高校医务室管理系统项目概述2.1可行性分析2.1.1技术可行性2.1.2 经济可行性2.1.3操作可行性2.2 系统功能分析2.2.1功能性分析2.2.2......