D. Edge Split

2023-09-21 21:26:27

Problem - D - Codeforces

思路:思路想到了,但是不知道用什么方法写。。首先我们先看只有一个树的情况,那么如果我们所有的边是一个颜色,那么答案是1+n,如果我们将其中的一条边变色,那么产生的答案是2+n-1,答案是不变的,如果有n条边,同样的方式我们如果所有的边为一个颜色,那么产生答案是1+n,但是n条边的树是存在环的,我们可以将环上的一条边变为另一个颜色那么答案就会变成1+n-1,所以我们通过总结发现,只要同一种颜色没有环,最终的答案就是最小的。那么现在问题就变成了构造两个无环图,我们可以先构造一颗树,那么最多会剩下3条边,如果剩下的三条边能够构成环,那么我们任意的选择一条边,加到树上,然后选择这条边的某个顶点,然后把这个顶点在树种的所有连边全都删除,除了新加的这条边,这样是一定不会有环的,因为首先树上是肯定没有环的,可能剩下的边存在环,因为新砍下来边是从树上看下来的,那么它们之间肯定是不能够形成环的,并且这写边与剩下的两个一定也不能够构成,因为没有重边的存在,要构成环那么只能是之前新加的那条边,所以肯定也不可能

// Problem: D. Edge Split
// Contest: Codeforces - Codeforces Round 819 (Div. 1 + Div. 2) and Grimoire of Code Annual Contest 2022
// URL: https://codeforces.com/contest/1726/problem/D
// Memory Limit: 256 MB
// Time Limit: 2000 ms

#include<bits/stdc++.h>
#include<sstream>
#include<cassert>
#define fi first
#define se second
#define i128 __int128
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> PII;
const double eps=1e-7;
const int N=5e5+7 ,M=5e5+7, INF=0x3f3f3f3f,mod=1e9+7,mod1=998244353;
const long long int llINF=0x3f3f3f3f3f3f3f3f;
inline ll read() {ll x=0,f=1;char c=getchar();while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {x=(ll)x*10+c-'0';c=getchar();} return x*f;}
inline void write(ll x) {if(x < 0) {putchar('-'); x = -x;}if(x >= 10) write(x / 10);putchar(x % 10 + '0');}
inline void write(ll x,char ch) {write(x);putchar(ch);}
void stin() {freopen("in_put.txt","r",stdin);freopen("my_out_put.txt","w",stdout);}
bool cmp0(int a,int b) {return a>b;}
template<typename T> T gcd(T a,T b) {return b==0?a:gcd(b,a%b);}
template<typename T> T lcm(T a,T b) {return a*b/gcd(a,b);}
void hack() {printf("\n----------------------------------\n");}

int T,hackT;
int n,m,k;
int ans[N];
PII edge[N];
int f[N];
int h[N],e[M],ne[M],idx;
bool st[N];

void add(int a,int b) {
	e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}

int find(int x) {
	if(x!=f[x]) f[x]=find(f[x]);
	return f[x];
}

int dfs(int u,int fa,bool &flag) {
	if(st[u]) {
		flag=true;
		return 0;
	}
	st[u]=true;
	int res=1;
	for(int i=h[u];i!=-1;i=ne[i]) {
		int j=e[i];
		
		if(j==fa) continue;
		res+=dfs(j,u,flag);
	}
	
	return res;
}

bool check(vector<PII> &vis) {
	for(int i=0;i<=n;i++) h[i]=-1,st[i]=false;
	idx=0;
	
	for(int i=0;i<vis.size();i++) {
		int a=vis[i].fi,b=vis[i].se;
		add(a,b),add(b,a);
	}
	
	bool flag=false;
	if(dfs(vis[0].fi,-1,flag)==3&&flag) return true;
	else return false;
}

void solve() {
	n=read(),m=read();
	
	for(int i=1;i<=n;i++) f[i]=i;
	for(int i=1;i<=m;i++) ans[i]=0;
	
	vector<PII> vis;
	for(int i=1;i<=m;i++) {
		int a=read(),b=read();
		edge[i]={a,b};
		int fa=find(a),fb=find(b);
		
		if(fa!=fb) {
			f[fa]=fb;
			ans[i]=1;
		}else vis.push_back({a,b});
	}
	
	if(vis.size()==3) {
		if(check(vis)) {
			int id=vis[0].fi;
			for(int i=1;i<=m;i++) {
				if(!ans[i]) continue;
				if(edge[i].fi==id||edge[i].se==id) ans[i]=0;
			}
			for(int i=1;i<=m;i++) {
				if(edge[i].fi==vis[0].fi&&edge[i].se==vis[0].se) ans[i]=1;
			}
		}
	}
	
	for(int i=1;i<=m;i++) printf("%d",ans[i]);
	printf("\n");
}   

int main() {
    // init();
    // stin();
	// ios::sync_with_stdio(false); 

    scanf("%d",&T);
    // T=1; 
    while(T--) hackT++,solve();
    
    return 0;       
}          

更多推荐

为什么tomcat要自定义线程池实现?

背景最近在研究tomcat调优的问题,开发人员做过的最多的tomcat调优想必就是线程池调优了,但是tomcat并没有使用jdk自己的线程池实现,而是自定了了线程池,自己实现了ThreadPoolExecutor类位于org.apache.tomcat.util.threads包下jdk线程池首先回顾一下jdk的线程池

git rebase 修改中间的commit

0.前言今天在移植最新版本kfence功能的时候,一共需要移植大概40多个patch,中间有很多patch存在冲突,需要手动修改后才能合并。当所有的patch都合并完成进行编译的时候,发现其中一个patch手动合并出了个错误。假如共有40个patch,编号1-40,现在问题是第20个patch需要再修改一下,而21-4

【【萌新的FPGA学习之Vivado下的仿真入门-2】】

萌新的FPGA学习之Vivado下的仿真入门-2我们上一章大概了解了我们所需要进行各项操作的基本框架对于内部实现其实一知半解我们先从基本的出发但从FPGA了解一下vivado下的仿真入门正好帮我把自己的riscV波形拉一下行为级仿真step1:进入仿真界面:SIMULATION->单击RunSimulation->单击

无线振弦采集仪应用隧道安全监测的方案解析

无线振弦采集仪应用隧道安全监测的方案解析隧道是交通建设中重要的组成部分,安全监测是保障隧道使用安全的重要手段。无线振弦采集仪可以对隧道进行实时、连续的振动监测,提供精确的数据分析和预警,是隧道安全监测的有效工具。无线振弦采集仪利用振弦原理,通过测量隧道内振动的频率、振幅及相位等参数,来检测隧道结构的状态,从而判断隧道的

加密 K8s Secrets 的几种方案

前言你可能已经听过很多遍这个不算秘密的秘密了--KubernetesSecrets不是加密的!Secret的值是存储在etcd中的base64encoded(编码)字符串。这意味着,任何可以访问你的集群的人,都可以轻松解码你的敏感数据。任何人?是的,几乎任何人都可以,尤其是在集群的RBAC设置不正确的情况下。任何人都可

在Linux中安装nginx-1.20.1+php-7.4.28(增加扩展)

Nginx+PHP安装在公网IP为x.x.x.x的服务器上需要下载安装的软件版本:nginx-1.20.1+php-7.4.28需要增加的PHP扩展如下:在编译安装php-7.4.28时加上的pcntl;单独下载安装的Wxwork_finance_sdk;(在编译安装php-7.4.28时加上--disable-int

Android字体大小dp,sp,px系统设置字体大小变化表现

Android字体大小dp,sp,px系统设置字体大小变化表现<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://sc

.NET Framework 2023 年 8 月安全和质量汇总更新

作者:SaliniAgarwal排版:AlanWang今天,我们发布了针对.NETFramework的2023年8月安全和质量汇总更新。安全CVE-2023-36899–.NETFramework远程代码执行漏洞此安全更新修复了IIS上的应用程序存在的一个漏洞,该漏洞使用其父应用程序的应用程序池,可能导致权限升级或其他

基于SpringBoot的在线商城系统设计与实现

目录前言一、技术栈二、系统功能介绍用户信息管理商品分类管理商品信息管理轮播图管理三、核心代码1、登录模块2、文件上传模块3、代码封装前言现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本ONLY在线商城系统就是在这样的大环境下诞生,其可以帮助管理者在

LuatOS-SOC接口文档(air780E)--errDump - 错误上报

示例--基本用法,10分钟上报一次,如果有的话iferrDumpthenerrDump.config(true,600)end--附开源服务器端:https://gitee.com/openLuat/luatos-devlogerrDump.dump(zbuff,type,isDelete)手动读取异常日志,主要用于用

AG35学习笔记(二):安装编译SDK、CMakeLists编译app、Scons编译server

目录一、概述二、安装SDK2.1网盘SDK-权限不够2.2bj41-需要交叉source2.3mullen-relocate_sdk.py路径有误三、编译SDK3.1/bin/sh:1:gcc:notfound3.2curses.h:Nosuchfileordirectory四、CMakeLists-编译app4.1c

热文推荐