原先有一个图,dfs序是1,2,...,n, 但是其中一些边被破坏,给定被破坏边后的图,求最少要加几条边,可以使图的dfs序为1,2,...,n

news/2024/7/20 22:34:48 标签: 深度优先, 算法

题目

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
const int maxn = 2e5 + 5, maxm = 2e3 + 5;
int a[maxn];
int nxt;//下一个应该遍历的结点
int res = 0;
int n, m;
vector<int> G[maxn];
void dfs(int u){
    if(u == nxt) nxt++;
    for(int i = 0; i < G[u].size();){//这里不写i++
        int v = G[u][i];
        if(v < nxt){//之前遍历过的结点,跳过
            i++;
            continue;
        } 
        if(v > nxt){
            res++;
            dfs(nxt);//这里不i++, 等把nxt~v-1的结点遍历完再dfs(v)
            /*
            1
            4 1
            1 3
            */
        }
        else{
            dfs(v);
            i++;
        }
    }
}
void solve(){
	cin >> n >> m;
    for(int i = 1; i <= n; i++){
        G[i].clear();
    }
    res = 0;
    for(int i = 1; i <= m; i++){
        int u, v;
        cin >> u >> v;
//         if(u == v) continue;
//         if(u > v) swap(u, v);
        G[u].push_back(v);
        G[v].push_back(u);
    }
    for(int i = 1; i <= n; i++){
        sort(G[i].begin(), G[i].end());//按顺序来
    }
    nxt = 1;
    while(nxt <= n){
        res++;//向nxt连一条边
        dfs(nxt);
    }
    cout << res - 1 << '\n';//减去向1连的一条边
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	int T;
	cin >> T;
	while(T--){
		solve();
	}
}


http://www.niftyadmin.cn/n/5326937.html

相关文章

Qt 使用vs2019制作Qt静态库( *.lib )并使用

一 .创建静态库 1.创建Qt Class Library(Qt静态类库)项目 2.设置项目名以及项目路径(注意:不能有中文字符) 点击next 3.选则需要的模式以及Qt 模块 然后点击next,Finish完成创建 4. 然后手动添加Qt Widget Form File (.ui)并对设计ui 5. tpendialog.h #pragma once #includ…

2024年AMC8历年真题练一练和答案详解(8),以及全真模拟题

今天是1月15日&#xff0c;距离本周五的AMC8正式比赛还有四天时间&#xff0c;已经放寒假了的孩子可以多点时间复习备考&#xff0c;还在准备期末考试的孩子可以先以期末考试为重&#xff0c;忙里偷闲刷一下AMC8的题目保持感觉——系统的知识学习可能时间不够了&#xff0c;可以…

Linux常用命令大全(三)

系统权限 用户组 1. 创建组groupadd 组名 2. 删除组groupdel 组名 3. 查找系统中的组cat /etc/group | grep -n “组名”说明&#xff1a;系统每个组信息都会被存放在/etc/group的文件中1. 创建用户useradd -g 组名 用户名 2. 设置密码passwd 用户名 3. 查找系统账户说明&am…

C++核心编程——类和对象(一)

本专栏记录C学习过程包括C基础以及数据结构和算法&#xff0c;其中第一部分计划时间一个月&#xff0c;主要跟着黑马视频教程&#xff0c;学习路线如下&#xff0c;不定时更新&#xff0c;欢迎关注。 当前章节处于&#xff1a; ---------第1阶段-C基础入门 ---------第2阶段实战…

springboot3整合knife4j(swagger增强)

springboot升级到3后之前的knife4j配置就要变了一下了 1.导入依赖 <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId> <version>4.1.0</…

Docker进阶数据卷目录挂载及在线部署

前言 为了很好的实现数据保存和数据共享&#xff0c; Docker 提出了 Volume 这个概念&#xff0c;简单的说就是绕过默认的联合 文件系统&#xff0c;而以正常的文件或者目录的形式存在于宿主机上。又被称作数据卷 一. 数据卷介绍 Docker 中的数据卷&#xff08;Volume&#x…

java获取视频文件的编解码器

java获取视频文件的编解码器 引入jar包&#xff1a; <dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.9</version></dependency>测试类 package com.jd.brand.approve.…

理解x86_64 Paging(Page Map Level 4)

原文 一个方便编译内核的小工具 page 在 x86_64 上&#xff0c;页面是 0x1000 字节的内存片&#xff0c;按 0x1000 字节对齐。 这就是为什么&#xff0c;如果查看 /proc/<pid>/maps &#xff0c;会发现所有地址范围的地址开始和结束都将以 0x000 结尾&#xff0c;因为 …